2012-04-11 6 views
13

Ich benutze Entity Framework 4.2 (Code First), um auf meine Datenbank zuzugreifen. Ich war unter der Annahme, dass, wenn ich eine Entität mit SingleOrDefault abgefragt habe, würde es nur die Datenbank abfragen, wenn die Entität nicht bereits verfolgt wurde, aber dies scheint nicht der Fall zu sein. Die Methode Find scheint dies zu tun. Das Problem mit Find ist, dass es mir nicht zulässt, damit verbundene Daten zu laden.Entitätsframework-Code Erste Suche vs SingleOrDefault (Eager Loading)

Gibt es eine Möglichkeit, die Find Methode zu verwenden, aber auch Daten eifrig zu laden? Als Beispiel möchte ich ein Buch und alle seine Bewertungen laden:

// Load book from the database 
Book book = context.Books.Find(1); 
context.Entry<Book>(book).Collection<Review>.Load(); // Book.Reviews is now populated 

// Load book from the change tracker 
// This will include all Reviews as well 
Book book2 = context.Books.Find(1); 

Mit SingleOrDefault ich die Bewertungen laden kann, wenn ich das Buch bekommen mit einbeziehen:

// Load book + reviews from the database 
Book book = Book.Include("Reviews").SingleOrDefault(b => b.Id == 1); 

// Doing the same thing again requeries the database 
Book book2 = Book.Include("Reviews").SingleOrDefault(b => b.Id == 1); 

Gibt es eine Möglichkeit zu Holen Sie sich das Verhalten von Find mit dem eifrigen Laden von SingleOrDefault?

Antwort

11

Die Methode Find dient zum Suchen einer einzelnen Entität nach Schlüssel. Die Methode SingleOrDefault dient zum Ausführen der Abfrage. Eager Loading kann nur ein Teil der Abfrage sein, die wirklich auf der Datenbank ausgeführt wird, so dass sie nicht mit Find verwendet werden kann.

Als Abhilfe können Sie es auf diese Weise umschreiben kann:

// This will check only on in-memory collection of loaded entities 
Book book = context.Books.Local.SingleOrDefault(b => b.Id == 1); 
if (book == null) 
{ 
    book = context.Books.Include(b => b.Review).SingleOrDefault(b => b.Id == 1); 
} 
+0

Hatte keine Ahnung, dass diese lokale Eigenschaft existiert. Vielen Dank! – Dismissile

+0

Hallo, und in Bezug auf die Geschwindigkeit der Operation, Find vs SingleOrDefault, um die Entity-Informationen zu erhalten? – Patrick

0

Wenn Lazy-Loading aktiviert ist, funktioniert Find für Sie. Versuchen Sie Folgendes:

Book book = context.Books.Find(1); 
int n = book.Reviews.Count; 

Überprüfen Sie den Wert für die Variable "n". EF muss die Sammlung laden, wenn Sie das erste Mal darauf zugreifen.

+2

Sein Punkt ist, dass er nicht faul-Laden verwenden will und will, dass sie eifrig geladen. –