2009-09-11 10 views
9

Mam standardową tabelę samoczynnie odwołującą się Categories. W moim modelu podmiotu utworzyłem asocjacje Children i Parent. Czy możliwe jest załadowanie całego obiektu Category bez leniwego ładowania?Chętne ładowanie tabeli samoindlinowania

jeśli użyję poniższego kodu, to ładuje tylko do drugiego poziomu.

db.Categories.MergeOption = System.Data.Objects.MergeOption.NoTracking; 

var query = from c in db.Categories.Include("Children") 
      where c.IsVisible == true 
      orderby c.SortOrder, c.Id 
      select c; 

Czy można załadować referencje, jeśli wszystkie obiekty kategorii zostały już załadowane?

Jednym ze sposobów, aby go załadować jest dodać właściwość Children wielokrotnie

db.Categories.Include("Children.Children.Children.Children.Children") 

ale to generuje bardzo długo szalony kod T-SQL, a także, że nie robi tego, co chcę.

Odpowiedz

1

Nie, nie jest to możliwe. Rozważ: Wszystkie kwerendy LINQ do encji są tłumaczone na SQL. Która instrukcja SQL zawiera nieograniczoną głębię w hierarchii samo-odwołującej się? W standardowym SQL nie ma takiego. Jeśli istnieje rozszerzenie tego w T-SQL, nie wiem, co to jest, i nie sądzę, że dostawcy EF też.

+1

Ale jeśli uruchomię zapytanie "SELECT * FROM Categories", załadowałem całą tabelę, a także załadowałem wszystkie kategorie rodziców i dzieci, ponieważ wszystkie znajdują się w jednej tabeli. Więc w tym przypadku nie jest zbyt skomplikowane przypisywanie tych wczytanych rekordów do właściwości referencyjnych, czy nie? –

+1

Jeśli rzeczywiście wykonałeś iterację całej tabeli, wszystkie obiekty * będą * w pamięci i * zostaną * już ustalone, z włączeniem lub bez. Ale tak się nie stanie, dopóki nie osiągniesz ostatniego rekordu w tabeli. Dołącz gwarancje, że powiązane obiekty będą tam na * pierwszym * rekordzie, które wykonujesz iteracyjnie. –

+3

"Które instrukcje SQL zawierają nieograniczoną głębię w hierarchii odwołującej się do siebie?" -> Common Table Expressions w T-SQL –

1

OK, możesz rozważyć użycie metody Load.

if (!category.Children.IsLoaded) 
     category.Children.Load(); 

Oczywiście obiekt kategorii musi być śledzony przez ObjectContext.

Tutaj jest lepsze wyjaśnienie: how-does-entity-framework-work-with-recursive-hierarchies-include-seems-not-to.

+0

Znam tę metodę (wygeneruje ona mnóstwo zapytań T-SQL), ale również ładuję ją bez śledzenia, ponieważ zapisuję ją w pamięci podręcznej. Szukam czegoś innego. Jeśli załaduję całą tabelę kategorii, załadowałem również kategorie rodziców i dzieci, ale właściwości powiązania nie zostaną załadowane. Mam również powiązaną tabelę CategoryType i muszę załadować ją dla każdej kategorii, niezależnie od tego, czy odnoszą się do tego samego wiersza ... –

+0

Ok, nie widziałem, że trzeba go buforować. Hmm, spróbuję pomyśleć, jak można to rozwiązać. –

0

Jednym ze sposobów Użyłem do wdrożenia, że ​​jeśli mam kilku podmiotów Chcę, aby wszystkie dzieci w własnym przedstawieniu tabeli jest użycie rekurencyjnej CTE i procedurę przechowywaną, aby uzyskać ich identyfikatory przy użyciu Entity Framework: Here is the code using Entity Framework and code first approach

Powiązane problemy