24

Jestem całkiem nowy w świecie ASP .NET MVC. Może dlatego nie potrafię wyjaśnić sobie przyczyny tego, jak dla mnie, irytującego problemu.Dlaczego Entity Framework zwraca pustą listę <> zamiast pustych?

Mam jedną klasę z relaksem One-to-Many.

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

Kiedy jestem utrzymujących jedną instancję tej klasy, wypełnić to związek z pustą listą <>

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

Problemem jest to, że gdy próbuję odzyskać tego wystąpienia, a dla z jakiegokolwiek powodu, próbuję uzyskać dostęp do tej listy, system daje mi wyjątek odwołania zerowego ...

Moje pytanie brzmi: dlaczego EF nie zwraca pustych list zamiast zerowych? Zwłaszcza w tym przypadku, że utrzymuję go z pustą listą?

Istnieje sposób na uniknięcie sprawdzania, czy instancje są puste?

+0

co to jest obiekt klasy framework? –

Odpowiedz

21

Powinieneś mieć swój obiekt utworzyć te listy w konstruktorze. EF nie tworzy zależnych kolekcji i oczekuje, że jednostka to zrobi.

Więc sprawa, należy dokonać podmiot tak:

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

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

To zdecydowanie rozwiązuje mój problem! Dzięki za pomoc! Więc EF wywołuje konstruktor obiektów przed załadowaniem go z utrwalonymi informacjami, nieprawdaż? –

+0

Nie, EF nie "wywołuje" konstruktora. C# ma. Ilekroć obiekt jest tworzony, wywoływany jest konstruktor.Nawet gdy EF materializuje obiekty z bazy danych. –

+0

Got to! Dzięki! –

16

Dokonaj wirtualnej kolekcji otherClasses. Umożliwi to EF leniwne załadowanie kolekcji.

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

przeciwnym razie użyj chętny załadunek z Include metody.

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

Rzeczywiście, leniwy ładunek rozwiązuje mój problem ... Ale staram się uniknąć leniwego ładowania, ponieważ to dawało mi błąd Serialization Reference, gdy korzystałem z żądań JSON. W każdym razie, cieszę się z twojej pomocy. Dzięki! –

+0

W przypadku okrągłych problemów referencyjnych można używać atrybutów takich jak 'JsonIgnore', aby zapobiec serializacji właściwości nawigacji wstecznej. – Jess

0

Tak więc, jeśli dobrze rozumiem, dodajesz pusty List<OtherClass> do kontekstu, a następnie próbuje je odzyskać.

Sądzę, że trzeba się zastanowić, w jaki sposób kontekst będzie śledzić i wyszukiwać podmioty, które są w jego kontekście. Zwykle jest to wykonywane przez jednostkę. W twoim przykładzie nie podałeś encji, a więc nie ma ona żadnego kontekstu na encji.

Dlatego podczas zapytania kontekst nie znajduje obiektu i zwraca wartość null.

Jeśli chcesz zainicjować nowy obiekt, zaleciłbym nadać mu przynajmniej Key (zazwyczaj właściwość Id), a następnie wybrać ten klucz podczas wyszukiwania później.

Mam nadzieję, że to pomoże.

+0

W rzeczywistości moje prawdziwe zajęcia mają wszystkie Atrybut ID. Był to tylko przykład, w którym zapomniałem podać ID: P. W każdym razie, dzięki za odpowiedź! –

Powiązane problemy