2013-03-12 12 views
8

先使用EF5數據庫。在創建我的背景時,我將ContextOptions.LazyLoadingEnabled設置爲true。有些事情發生改變到false(我們的代碼中沒有任何地方改變了設置)。什麼是在我的EF上下文中將LazyLoadingEnabled設置爲false?

在不同的點上,我使用代碼this snippet(從一個實體對象獲取上下文)來檢查它是否仍然是true。這個問題只在運行多線程時纔會顯現(加載一些實體,然後通過多線程代碼傳遞它們)。它不會出現在代碼中的任何一致點,所以不可能確定究竟是什麼原因導致它。

我想我只是希望有人可能知道更多關於EF的內部工作,並給我一個線索...

+0

你怎麼沒有使用'DbContextConfiguation.LazyLoadingEnabled'?儘管如此,也許它只是'ContextOptions.LazyLoadingEnabled'的包裝。 – 2013-03-13 00:36:06

+0

我認爲這只是一個包裝。這是從EF4升級,所以舊的方式可能只是爲了向後兼容。 – dudeNumber4 2013-03-13 19:00:57

+0

我在EF 4有同樣的問題http://stackoverflow.com/questions/15374758/lazyloadingenabled-being-to-set-to-false-mid-query-for-one-id-only – bdwain 2013-03-14 20:16:08

回答

1

LazyLoadingEnabled確定是否當訪問導航屬性相關的對象會自動加載。

我記得在朱莉Lermans圖書閱讀本:programming EF by Julie Lerman

你需要一個動態代理,爲延遲加載。 您需要具有虛擬導航屬性的公共類。

0

實體框架上下文不是線程安全的。遇到的問題發生在多線程訪問延遲加載的屬性時。在檢查NavigationProperty的值時,內部EF會關閉延遲加載,然後再將其切換回去。 (請參閱RelatedEnd.DisableLazyLoading()

因此,您的情況發生的情況可能如下所示:一個線程當前正在訪問NavigationProperty,並且在完成另一個線程嘗試訪問附加到同一個上下文的對象的導航屬性之前。在那個時候,延遲加載暫時關閉,因此沒有數據被加載。

EF明確指出ObjectContext不是線程安全的,因此確保不同線程之間沒有併發訪問可能是一個好主意。

相關問題