Почему Entity Framework возвращает пустой список <> вместо пустых?
Я новичок в мире ASP.NET MVC. Может быть, это причина, по которой я не могу объяснить себе причину того, что для меня является раздражающей проблемой.
У меня есть один класс с One-To-Many relashionhip.
class MyClass{
public List<OtherClass> otherClasses {get;set;}
}
Когда я сохраняю один экземпляр этого класса, я заполняю его с пустым List < >
MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() }
context.myClass.Add(myClass);
Проблема в том, что когда я пытаюсь получить этот экземпляр и по какой-либо причине я пытаюсь получить доступ к этому списку, система дает мне Null Reference Exception...
Мой вопрос: почему EF не возвращает пустые списки вместо нулевых? Особенно в этом случае, что я сохраняю его с пустым списком?
Есть ли способ избежать проверки, если экземпляры null?
Ответы
Ответ 1
Вам нужно, чтобы ваша сущность создала эти списки в конструкторе. EF не создает зависимые коллекции и ожидает, что сущность сделает это.
Итак, ваше дело, вы бы сделали свой объект следующим:
class MyClass{
public List<OtherClass> _otherClasses {get;set;}
public MyClass() {
_otherClasses = new List<OtherClass>();
}
}
Ответ 2
Сделайте коллекцию otherClasses
виртуальной. Это позволит EF ленить загрузку коллекции.
class MyClass{
public virtual List<OtherClass> otherClasses {get;set;}
}
В противном случае используйте загрузку с помощью метода Include
.
context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo);
Ответ 3
Итак, если я правильно понимаю, вы добавляете пустой List<OtherClass>
в контекст, а затем пытаетесь извлечь его.
Думаю, вам нужно подумать о том, как контекст будет отслеживать и запрашивать объекты, которые находятся в его контексте. Обычно это делается Key
объекта. В вашем примере вы не дали сущности a Key
, поэтому контекст не имеет дескриптора для объекта.
Поэтому, когда вы запрашиваете, контекст не находит объект и возвращает null.
Если вы хотите инициализировать новый объект, я бы рекомендовал дать ему хотя бы Key
(обычно это свойство Id), а затем выбрать по этому ключу при поиске позже.
Надеюсь, что это поможет.