24

Я довольно новый в мире ASP.NET MVC. Может быть, именно по этой причине я не могу объяснить себе причину того, что для меня является раздражающей проблемой.Почему Entity Framework возвращает null List <> вместо пустых?

У меня есть один класс с One-to-Many relashionship.

class MyClass{ 
    public List<OtherClass> otherClasses {get;set;} 
} 

Когда я сохраняющиеся один экземпляр этого класса, я заполняю его отношения с пустым списком <>

MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() } 
context.myClass.Add(myClass); 

Проблема заключается в том, что, когда я пытаюсь получить этот экземпляр, и для любая причина, я пытаюсь получить доступ к этому списку, система дает мне Null Reference Exception ...

Мой вопрос: почему EF не возвращает пустые списки вместо нулевых? Особенно в этом случае, что я сохраняю его с пустым списком?

Есть ли способ избежать проверки, если экземпляры null?

+0

Какой у вас класс фреймворка? –

ответ

21

У вас должен быть объект, создающий эти списки в конструкторе. EF не создает зависимые коллекции и ожидает, что организация сделает это.

Итак, ваше дело, вы бы сделать ваше лицо, как это:

class MyClass{ 
    public List<OtherClass> _otherClasses {get;set;} 

    public MyClass() { 
     _otherClasses = new List<OtherClass>(); 
    } 
} 
+0

Это определенно решает мою проблему! Спасибо за вашу помощь! Таким образом, EF вызывает конструктор объектов, прежде чем загружать его с сохраненной информацией, не так ли? –

+0

Нет, EF не «вызывает» конструктор. C# делает. Всякий раз, когда объект создается, вызывается конструктор.Даже когда EF материализует объекты из db. –

+0

Получил! Благодаря! –

16

Сделайте виртуальную фотографию otherClasses. Это позволит EF лениво загружать коллекцию.

class MyClass{ 
    public virtual List<OtherClass> otherClasses {get;set;} 
} 

В противном случае используйте активную загрузку с помощью метода Include.

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo); 
+1

Действительно, ленивая загрузка решает мою проблему ... Но я стараюсь избегать ленивой загрузки, потому что это давало мне ошибку Circial Reference Serialization, когда я пользовался JSON-запросами. Во всяком случае, я рад за вашу помощь. Благодаря! –

+0

Для циклических справочных проблем вы можете использовать такие атрибуты, как 'JsonIgnore', чтобы исключить сериализацию свойства обратной привязки. – Jess

0

Итак, если я правильно понимаю, вы добавляете пустой List<OtherClass> к контексту, а затем пытается восстановить его.

Я думаю, вам нужно подумать о том, как контекст будет отслеживать и запрашивать объекты, которые находятся в его контексте. Обычно это делается Key объекта. В вашем примере вы не предоставили сущности a Key, поэтому контекст не имеет дескриптора на объекте.

Поэтому, когда вы запрашиваете, контекст не находит объект и возвращает null.

Если вы хотите инициализировать новый объект, я бы рекомендовал дать ему хотя бы Key (обычно это свойство Id), а затем выбрать по этому ключу при поиске позже.

Надеюсь, это поможет.

+0

На самом деле, у моих реальных классов есть все Идентификатор. Это был только пример, когда я забыл включить ID: P. В любом случае, спасибо за ваш ответ! –

Смежные вопросы