9

Ich habe eine bestimmte Abfrage in meinem Code, die alle verwandten Entitäten (beide -> 1 FKs und -> N FKs) geladen werden muss, weil der Kontext direkt danach entsorgt wird .EF Code First: Include funktioniert nicht auf optionale Beziehung

Ich habe eine generische "Query" -Methode, die params Expression<Func<MyItem, object>>[] includes dauert und dann intern kettet sie. Dieser Teil funktioniert gut.

Die Abfrage sieht wie folgt aus:

var item = facade.Query<MyItem>(
       c => c.Childs.Select(x => x.Parent), 
       c => c.Childs.Select(x => x.SubChild1), 
       c => c.Childs.Select(x => x.SubChildNotWorking), 
       c => c.Childs.Select(x => x.SubChild2), 
       c => c.Childs.Select(x => x.SubChild3), 
       c => c.Childs.Select(x => x.SubChildrens) 
       ).FirstOrDefault(c => c.Name == name); 

Die Zuordnung für die nicht arbeiten Eigentum (in der Konfiguration von SubChildNotWorking platziert):

this.HasMany(scnw => scnw.Childs).WithOptional(c => c.SubChildNotWorking).HasForeignKey(c => c.MyForeignKey); 

Von allen enthält, wird nur die SubChildNotWorking doesn‘ t tue tatsächlich. Beim Überprüfen des zurückgegebenen Objekts mit dem Debugger werden die Proxys für alle Eigenschaften angezeigt. Das Öffnen der Proxies gibt mir die korrekten Daten für alle anderen Relationen und ein "Die Objektkontext wurde bereits Exception angeordnet" für die Eigenschaft SubChildNotWorking.

Der einzige Unterschied I erkennen konnte ist, dass die SubChildNotWorking ein NULL festlegbaren FK ist (mit NULL festlegbare Spalte auf der DB und WithOptional Konfiguration im DbContext), während alle anderen nicht NULL festlegbaren FKs sind mit WithRequired konfiguriert.

Die Datenbank ist auch eine Legacy-DB, die nicht mit Code First erstellt wurde und ihren Konventionen nicht folgte. Ich habe gerade die Zuordnungen im DbContext vorgenommen. Alles andere funktioniert gut.

Ich versuche herauszufinden, ob eifrig Laden auf Nullable FKs funktioniert, aber ich konnte keine Dokumentation darüber finden.

Ist das ein Fehler oder beabsichtigtes Verhalten? Aber vor allem, wie löse ich das?

Danke.

+0

Was passiert, wenn Sie nur die 'SubChildNotWorking' ohne die anderen subchildren umfassen geschieht? Funktioniert es dann? – Slauma

+0

Nein. Funktioniert auch nicht. –

+1

Können Sie überprüfen, ob das SQL korrekt aussieht (mit 'var sql = facade.Query (c => c.Childs.Select (x => x.SubChildNotWorking)). ToString();') und die Abfrage manuell in testen SSMS, wenn es die erwarteten Ergebniszeilen zurückgibt. – Slauma

Antwort

0

Haben Sie definieren

[DataContract] 

auf Ihrer Klasse (Entitäten)? Wenn ja, vergessen Sie nicht Ihre SubChild mit

[DataMember] 

mit Anmerkungen versehen oder es könnte am belasteten Ende aber nicht angezeigt, wenn Sie Ihren GET Anruf auf Personen vornehmen.

0

Wenn Sie mit der Include-Methode arbeiten, sprechen Sie über das Muster der Eager-Ladung. Entitäten mit Beziehung werden als Sammlungen geladen. Für jeden Nicht-Nullable-Fremdschlüssel gibt es eine triviale Sammlung, die leer beginnt, für nullbare jedoch nicht. Auf dem Code zuerst könnten Sie die Navigationseigenschaft virtuell machen, aber es ist nicht Ihr Fall. Sie können es direkt auf Kontext, zum Beispiel versuchen, laden:

var someEntity = context.someEntities.Find(1); 
context.Entry(someEntity).Reference(e => e.EntityWithFKNullable).Load(); 

oder die kürzere Version:

context.EntitiesWithFKNullable.Load();