2010-09-07 10 views
6

Korzystanie z architektury Entity v4 i szablonów generatora obiektów POCO T4.Zatrzymanie EF od ładowania elementów podczas przypisywania skojarzenia

Problem polega na tym, że metody naprawiania ładują setki elementów, gdy przypisuję skojarzony element (patrz wiersz 4 poniżej).

Dim context = New SomeEntities 
Dim list = context.Lists.FirstOrDefault(Function(l) l.ListId = 2) 
Dim queryDetail = context.CreateObject(Of QueryDetail)() 
queryDetail.CriteriaColumnType = context.CriteriaColumnTypes.FirstOrDefault(Function(cct) cct.CriteriaColumnTypeId = 145) 

CriteriaColumnType podmiot, który jest przypisany jest zbiór QueryDetail przedmiotów, a gdy przeniesienie zostało dokonane, sposób fixup na jednostkę CriteriaColumnType jest leniwa ładowanie wszystkich powiązanych QueryDetails.

Jak mogę utworzyć stowarzyszenie FK i dołączyć jednostkę CriteriaColumnType do mojego QueryDetail podmiotu bez ładowania wszystkich CriteriaColumnType'sQueryDetail zapisów?

+0

Aby wyjaśnić, masz 'QueryDetail' z właściwością o nazwie' CriteriaColumnType', która zawiera zbiór innych 'QueryDetail's. –

Odpowiedz

1

Czy potrzebujesz leniwego ładowania tutaj? Możesz go wyłączyć:

context.ContextOptions.LazyLoadingEnabled = false 
+1

Właściwie to rozważałem użycie tego, ale wydaje się, że to hack. Wydaje się, że trudno uwierzyć, że przypadkowy użytkownik Enitity Framework naprawdę chciałby, aby cała kolekcja tego obiektu została załadowana w tym przypadku! –

+1

Nie sądzę, że to jest hacky. Kontekst jest jednostką pracy. Nie wszystkie UOW wymagają leniwego ładowania. Nie musi to wpływać na inne UOW, które mogą wymagać leniwego ładowania. –

+1

Zgadzam się ze Stevem. Jeśli jedynym sposobem, aby tego uniknąć, jest wyłączenie leniwego ładowania, to powinno być traktowane jako błąd. Jedynym powodem tego problemu jest śledzenie zmian (właściwości nawigacji FixUp po obu stronach powiązania). Kod przypisuje wartość właściwości nawigacji po jednej stronie. To z kolei chce przypisać wartość do kolekcji nawigacji po drugiej stronie, ale z powodu dostępu do kolekcji inicjuje leniwy ładunek. –

1

Wpadłem też na ten problem. Operacja, która trwała milisekundy, trwała 3-4 sekundy, wszystko dlatego, że dodałem właściwość nawigacji wskazującą na dużą tabelę.

Rozwiązałem ten problem, po prostu usuwając cały kod poprawek z szablonu T4 - nasz projekt i tak nie potrzebuje tej funkcji. Usunąłem wszystko z tej linii:

region.Begin("Association Fixup"); 

do następnego regionu. Wywołanie(). Usunąłem również wszystkie wywołania metod poprawek z ustawiaczy właściwości, rejestrację procedur obsługi CollectorChange i flagę _settingFK.


Zobacz więcej to pytanie, dlaczego kod fixup jest tam: Why is "Fixup" needed for Persistence Ignorant POCO's in EF 4?. Stara się upewnić, że jeśli zmienisz jeden koniec dwukierunkowego powiązania, drugi koniec również zostanie zaktualizowany. Tak więc, np. Jeśli utworzysz nowy BlogPost i ustawisz jego właściwość User dla użytkownika, logika naprawy automatycznie doda go do kolekcji Postów użytkownika.

marc_s odpowiedział na inne pytanie, łącząc się z POCO Template Code Generation Options. Usunięcie kodu poprawek z szablonu T4 zmienia szablon z # 2 (podstawowe POCO z poprawką) na # 1 (podstawowe POCO bez poprawki).

Powiązane problemy