Почему Entity Framework возвращает пустой список <> вместо пустых? - PullRequest
28 голосов
/ 12 февраля 2012

Я довольно новичок в мире ASP .NET MVC. Может быть, поэтому я не могу объяснить себе причину того, что для меня является раздражающей проблемой.

У меня один класс с перевыбором «один ко многим».

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

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

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

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

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

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

Ответы [ 3 ]

27 голосов
/ 12 февраля 2012

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

Итак, в вашем случае вы бы сделали свою сущность такой:

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

    public MyClass() {
        _otherClasses = new List<OtherClass>();
    }
} 
16 голосов
/ 12 февраля 2012

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

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

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

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo);
0 голосов
/ 12 февраля 2012

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

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

Следовательно, при запросе контекст не находит объект и возвращает ноль.

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

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

...