web-dev-qa-db-de.com

Warum gibt Entity Framework null Liste <> anstelle von leeren zurück?

Ich bin ziemlich neu in der ASP .NET MVC-Welt. Vielleicht ist das der Grund, warum ich mir die Ursache für das, was für mich ein ärgerliches Problem ist, nicht erklären kann.

Ich habe eine Klasse mit One-To-Many-Beziehung.

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

Wenn ich eine Instanz dieser Klasse behalte, fülle ich ihre Beziehung mit einer leeren Liste <>

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

Das Problem ist, dass das System beim Versuch, diese Instanz abzurufen und aus irgendeinem Grund auf diese Liste zuzugreifen, eine Null-Referenz-Ausnahme ausgibt ...

Meine Frage ist: Warum gibt EF keine leeren Listen anstelle von Nullen zurück? Vor allem in diesem Fall, dass ich es mit einer leeren Liste behalte?

Gibt es eine Möglichkeit, die Überprüfung zu vermeiden, wenn Instanzen null sind?

27
igor.araujo

Ihre Entität sollte diese Listen im Konstruktor erstellen. EF erstellt keine abhängigen Sammlungen und erwartet dies von der Entität.

In Ihrem Fall würden Sie Ihre Entität so machen:

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

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

Machen Sie die Sammlung otherClasses virtuell. Dadurch kann EF die Sammlung faul laden.

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

Verwenden Sie andernfalls das Laden mit der Include-Methode.

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo);
16
Eranga

Wenn ich es richtig verstanden habe, fügen Sie dem Kontext einen leeren List<OtherClass> hinzu und versuchen dann, ihn abzurufen.

Ich denke, Sie müssen darüber nachdenken, wie der Kontext Entitäten in seinem Kontext verfolgt und abfragt. Dies wird normalerweise von der Key der Entität durchgeführt. In Ihrem Beispiel haben Sie der Entität keine Key gegeben. Daher hat der Kontext keine handle für die Entität.

Daher sucht der Kontext bei der Abfrage kein Objekt und gibt null zurück.

Wenn Sie eine neue Entität initialisieren möchten, würde ich empfehlen, ihr mindestens eine Key (normalerweise die Id -Eigenschaft) zu geben, und dann nach diesem Schlüssel auszuwählen, wenn Sie später nachschlagen.

Hoffe das hilft.

0
Davin Tryon