2013-03-12 6 views
8

Najpierw użyj bazy danych EF5. Po utworzeniu kontekstu ustawiam ContextOptions.LazyLoadingEnabled na true. Coś się dzieje, aby to zmienić na false (nigdzie w naszym kodzie nie jest to ustawienie zmienione).Co oznacza ustawienie opcji LazyLoadingEnabled na wartość false w kontekście EF?

W różnych punktach sprawdzam, czy nadal jest to za pomocą kodu this snippet (uzyskanie kontekstu z obiektu encji). Problem pojawia się tylko podczas uruchamiania wielu wątków (ładuj niektóre encje, a następnie przeprowadź je przez wielowątkowy kod). Nie występuje w żadnym spójnym punkcie kodu, więc niemożliwe jest ustalenie, co dokładnie powoduje to.

Chyba mam tylko nadzieję, że ktoś może wiedzieć więcej na temat wewnętrznego działania EF i dać mi wskazówkę ...

+0

Dlaczego nie używasz 'DbContextConfiguation.LazyLoadingEnabled'? Chociaż, być może jest to po prostu wrapper dla 'ContextOptions.LazyLoadingEnabled' tak czy inaczej. –

+0

Myślę, że to tylko opakowanie. Zostało to uaktualnione z EF4, więc stary sposób jest prawdopodobnie po prostu kompatybilny wstecz. – dudeNumber4

+0

Mam ten sam problem w EF 4 http://stackoverflow.com/questions/15374758/lazyloadingenabled-being-to-set-to-false-mid-query-for-one-id-only – bdwain

Odpowiedz

1

LazyLoadingEnabled określa czy powiązane obiekty są ładowane automatycznie, gdy nieruchomość nawigacja jest dostępna.

Pamiętam przeczytaniu tego w Julie Lermans książce: programming EF by Julie Lerman

Trzeba Dynamic proxy, za leniwy załadunku. Potrzebujesz klasy publicznej z właściwościami wirtualnej nawigacji.

0

Kontekst struktury encji nie jest bezpieczny dla wątków. Napotkany problem występuje, gdy wiele wątków ma dostęp do wczytanej właściwości. Wewnętrznie EF wyłącza leniwe ładowanie podczas sprawdzania wartości właściwości NavigationProperty i później ją włącza. (Patrz RelatedEnd.DisableLazyLoading())

Zatem, co dzieje się w twoim przypadku prawdopodobnie idzie tak: Jeden wątek jest obecnie dostępu do NavigationProperty i przed jej zakończeniem inny wątek próbuje uzyskać dostęp do właściwości nawigacji obiektu przyłączone do tego samego kontekstu. W tym momencie leniwy ładunek jest tymczasowo wyłączany, a zatem żadne dane nie są ładowane.

EF wyraźnie stwierdza, że ​​ObjectContext nie jest bezpieczny dla wątków, więc dobrze jest upewnić się, że nie ma równoczesnego dostępu z różnych wątków.

Powiązane problemy