Подтвердить что ты не робот

Почему 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?

4b9b3361

Ответ 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), а затем выбрать по этому ключу при поиске позже.

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