2009-06-23 2 views
7

Im ADO.Net Entity Framework habe ich ein Objekt mit 4 Referenzen zu anderen Objekten. Wenn ich diese Referenzen abfrage, werden zwei von ihnen automatisch (wie erwartet) geladen, und zwei von ihnen geben immer null zurück.Entity Framework-Referenzen werden nicht automatisch geladen

Bizarr genug, wenn ich manuell frage die Referenzen zu laden, laden sie nur Dandy.

Als Beispiel:

if (account.HoldingEntity == null && 
    account.HoldingEntityReference.EntityKey != null) { 

    account.HoldingEntityReference.Load(); 
    account.HoldingEntity = account.HoldingEntityReference.Value; 
} 

Als ich das HoldingEntity überprüfen es immer null ist, aber die Last der HoldingEntity ohne Probleme zurück.

Irgendwelche Hinweise?

Danke!

Antwort

7

Mit ADO.NET Entities, müssen Sie angeben, welche Einheiten Sie automatisch mit Include, wie in

Dim entity = (From e in db.Entities.Include("SubEntity")) 
+0

Perfect, das es zu lösen, danke! Ich denke, was ich immer noch nicht verstehe, ist, warum zwei der Referenzen automatisch laden, und zwei von ihnen nicht? – gerrod

+0

Das stimmt nicht ganz (zumindest ab EF 4 habe ich nie mit EF 1 gearbeitet). Sie können angeben, welche Referenzen automatisch (und sofort) geladen werden sollen, aber Sie können sich auch darauf verlassen, dass das Laden nach Bedarf geladen wird. Lazy Loading scheint jedoch auch in EF 4 gebrochen zu sein, so dass dies aus praktischer Sicht wahrscheinlich immer noch die richtige Antwort ist. Siehe http://msdn.microsoft.com/en-us/library/bb896272.aspx –

0

Dies erfolgte in EF v1 als Design-Entscheidung, und viele Entwickler eigentlich lieber laden wollen mit explizite Kontrolle darüber, ob und wann referenzierte Eigenschaften geladen werden.

Für EF v4, das vor Ende 2009 mit .NET 4.0 veröffentlicht wurde, haben Sie die Möglichkeit, das automatische verzögerte Laden zu aktivieren, wenn Sie dies wünschen. Weitere Informationen zum verzögerten Laden in EF v4 finden Sie im ADO.NET-Teamblog unter this blog post.

Marc

+0

Das ist wahr, Marc, aber das Problem mit dem verzögerten Laden ist, dass es viele Abfragen in der Datenbank gibt, und sollte mit Bedacht verwendet werden. Je nachdem, was Sie benötigen, können Sie die Entitäten einfach vorab laden. –

5

Wie andere gesagt haben Sie .Include() in v1 müssen, um zu vermeiden .Load()

In 4.0 anrufen können Sie DeferredLoadingEnable d setzen auf Ihrem ObjectContext (ich denke, dass wir diesen Namen ändern zu der passenderen LazyLoadingEnabled rechtzeitig für Beta2).

Warum bekommen Sie 2 Beziehungen sowieso schon geladen. Das ist wahrscheinlich ein Nebeneffekt von etwas, das als Relationship Fix-up bezeichnet wird.

Wenn sich zwei verbundene Entitäten im selben Kontext befinden, erhalten sie automatisch die Beziehung ihrer Beziehung, sodass sie zueinander zeigen. Wenn also (wie ich vermute) 2 der 4 Entitäten bereits in Ihrem Kontext sind, werden Sie, wenn Sie die Abfrage ausführen, in einer Situation landen, in der 2 Ihrer Beziehungen geladen sind, obwohl Sie .Include() oder .Load() nicht aufgerufen haben.

this helps

Prost Alex

+0

Ah! Danke dafür, macht Sinn. – gerrod

+0

Wie werden die Beziehungen automatisch repariert und gibt es eine Möglichkeit, dies zu deaktivieren? Dies verursacht einige schwerwiegende Nebenwirkungen für mich, weil es Objekte füllt. Vielen Dank! – strongriley