2011-01-10 23 views
8
using(DataContext db = new DataContext()) 
{ 
    var result = db.SomeTable.ToList(); 
    return result; 
} 

Problem jest po tym, jak zwróciłem wynik, połączenie jest zamknięte, a ponieważ jest zamknięte, ulega awarii, gdy próbuję uzyskać dostęp do dowolnego elementu podrzędnego. Dzieje się tak, ponieważ z leniwym ładowaniem ustawionym na True (domyślnie) nigdy nie ładuje relacji potomnych przed ich użyciem i zacznę ich używać PO ZAKOŃCZENIU połączenia. Jak najlepiej rozwiązać ten problem?Entity Framework lazy ładowanie

Próbowałem wyłączyć leniwy ładunek, ale nie załadowałem żadnego z tabel relacji podrzędnych.

Odpowiedz

14

Zawsze można jawnie załadować kolekcje podrzędne:

var result = db.SomeTable.Include("SomeChildCollectionName") 
         .Include("AnotherChildCollectionName") 
         .ToList(); 
+0

OK, ale co jeśli chcę załadować WSZYSTKIE elementy potomne bez konieczności jawnego zapisywania include ("ElementName")? Istnieje wiele elementów podrzędnych, dlatego – syncis

+0

@ user554978 - To nie jest obsługiwane. Musisz jawnie załadować wszystkie dzieci z góry za pomocą opcji Włącz lub pozostaw połączenie otwarte i pozwól, aby Leniwe ładowanie wykonało swoje zadanie. –

+0

Ah ok, dziękuję bardzo! – syncis

3

Można użyć metody .include().

var result = db.SomeTable.Include("ChildEntitySet").ToList(); 

Przed powrotem można również dodać połączenie result.ChildEntitySet.Load(). Jest to mniej efektywne, ponieważ spowoduje dwie wizyty na serwerze. Użycie metody .Include() wygeneruje instrukcję SQL z JOIN, zezwalającą tylko na jedną wycieczkę na serwer.

+1

Ok, ale co zrobić, jeśli chcę, aby załadować wszystkie elementy podrzędne bez konieczności jawnie pisać include („ElementName”)? Istnieje wiele elementów potomnych, to dlatego – syncis

Powiązane problemy