2012-04-11 12 views
13

Używam Entity Framework 4.2 (Code First), aby uzyskać dostęp do mojej bazy danych. Byłem przy założeniu, że gdybym zapytał podmiot używający SingleOrDefault, wyszukałby on tylko bazę danych, jeśli encja nie była jeszcze śledzona, ale wydaje się, że tak nie jest. Z drugiej strony wydaje się, że robi to metoda Find. Problem z Find polega na tym, że nie pozwala mi załadować powiązanych danych.Entity Framework Code First Find vs SingleOrDefault (Eager Loading)

Czy istnieje sposób korzystania z metody Find, ale również chętnie ładuje dane? Jako przykład, chcę, aby załadować książkę i wszystkie jego opinii:

// 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); 

Z SingleOrDefault mogę załadować opinie kiedy dostaję książkę korzystając obejmują:

// 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); 

Czy istnieje sposób, aby uzyskać zachowanie Find z chęcią załadowania SingleOrDefault?

Odpowiedz

11

Metoda Find służy do wyszukiwania pojedynczego obiektu według klucza. Metoda SingleOrDefault służy do wykonywania zapytania. Chętne ładowanie może być tylko częścią kwerendy, która jest rzeczywiście wykonywana w bazie danych, więc nie może być używana z Find.

Jako obejście można przepisać to w ten sposób:

// 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

Nie miałem pojęcia, że ​​ta lokalna właściwość istnieje. Dzięki! – Dismissile

+0

Witam, a jeśli chodzi o szybkość operacji, Find vs SingleOrDefault, aby uzyskać informacje o obiekcie? – Patrick

0

Jeśli ładowanie jest opóźnione, funkcja Znajdź będzie działać. Wypróbuj to:

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

Sprawdź wartość dla zmiennej "n". EF musi wczytać kolekcję, gdy uzyskasz do niej dostęp po raz pierwszy.

+2

Jego punktem jest to, że nie chce używać leniwy załadunku i chce je chętny załadowany. –

Powiązane problemy