2010-11-22 9 views
2

Gibt es einen Unterschied/best practice die Entity Framework 4 load Verfahren zwischen der Verwendung von, im Gegensatz zu über einen Fremdschlüssel Verbindung, um Kind Daten abzurufen?Läden verwandte Objekte Vs-Abfrage beitreten

So zum Beispiel, wenn ich Auftrag hatte und Orderlines, sollte ich schreiben eine Abfrage, die verwendet und inner join sagen auf orderId eine Sammlung abzurufen, oder sollte ich so etwas wie Orders.OrderLines tun. Laden Sie, um die Entitätssammlung zu füllen?

Dank

Antwort

4

Nun, es hängt ab, wenn Sie für sie automatisch diese Assoziationen bekommen, oder explizit fragen wollen.

Zum Beispiel, wenn Sie dies taten:

Order order = ctx.Orders.SingleOrDefault(); 
OrderLines lines = order.OrderLines; // do you want this null, or populated? 

Es gibt einen Grund, warum sie es nennen „verzögertes Laden“, weil Ihr faul, dass Sie nicht wollen, explizit für die Beziehung fragen .

Wenn Lazy loading ist auf (Standard), diese zweite Zeile wird automatisch eine zusätzliche Runde in die db, um die Reihenfolge Zeilen abrufen.

Wenn Sie das Lazy Loading von ausschalten, wird die obige Zeile null sein.

Und die Art und Weise, es zu bekommen ist:

Order order = ctx.Orders.Include("OrderLines").SingleOrDefault(); 

bezeichnet als "eager loading".

Sie sollten Joins für Beziehungen nicht explizit ausführen müssen. Wenn Sie die Beziehungen in Ihrem EDMX korrekt eingerichtet haben (z. B. haben Sie eine Navigationseigenschaft namens "OrderLines" auf Ihrer Entität "Auftrag"), führt Include einen linken äußeren Join für Sie aus.

Sie sollten nur explizite Joins durchführen, wenn die Beziehung nicht explizit im Modell verfügbar gemacht wird.

+0

Ausgezeichnet. Das war genau das, was ich suchte. Übrigens. Ist es möglich, eine Mischung aus beidem zu haben? Z.B. eine Repository-Klasse mit Methoden mit faulen und eifrigen? – hoakey

+0

@hoakey - leider nein, es ist eine Eigenschaft auf Ihrem Datenkontext. Sie sind jedoch nicht wirklich ein * Gegenteil * voneinander. Sie könnten Lazy Loading eingeschaltet lassen und Ihre Entitäten trotzdem eifrig laden. Aber wenn du nicht eifrig geladen hättest, würde die Entität immer noch abgeholt werden, nur mit einem zusätzlichen Anruf - weißt du, was ich meine? Sie sollten jedoch entscheiden, ob Sie sich für die Leistung Ihrer App interessieren. Wenn Sie dies tun, sollten Sie das verzögerte Laden deaktivieren. HTH. – RPM1984

+0

Ich bin die eifrige Verladestrecke gegangen. Wie auch immer, ein Stolperstein, den ich ein wenig schwierig zu lösen finde, ist, wie Sie tatsächlich auf die OrderLines-Eigenschaften zugreifen, da es nur eine Zeichenkette ist und daher nicht stark typisiert ist. Irgendwelche Ideen? – hoakey