2017-04-19 66 views
3

我有Backpack和Book實體。圖書參考揹包(一對多)。 我正在創建一個揹包和一堆書的實例。所以在這種情況下,揹包裏有一堆書。我正在將這些實體保存到數據庫。我正在驗證那些被保存到分貝。當我嘗試加載揹包時,它加載的很好,除導航屬性外,所有屬性都被設置。我還檢查LazyLoading沒有被禁用。我的導航屬性具有虛擬關鍵字。 我不知道我在做什麼錯。如果我嘗試加載與揹包包括()加載的書:實體框架不會加載引用和集合屬性

dbContext.Backpacks.Where(b=>b.Name!="").Include("Books").FirstOrDefault() 

我試圖弄清楚爲什麼它不裝書懶洋洋地?我在加載該書時遇到同樣的問題。當我裝入書時,它沒有附帶揹包。我看到BackpackId在那裏。

在我的財產getter/setter我有一些邏輯,將被解僱,但我不知道如何這可能是一個問題。

+0

你能顯示你的實體嗎? – DavidG

+0

ProxyCreation是否也啓用?延遲加載需要工作 – Sentry

+0

@Sentry我剛剛檢查並啓用了ProxyCreation。我把它設置爲假,但問題仍然沒有消失。 – Dilshod

回答

3

調試後的幾天隨時提供更多的信息,終於想通了這個問題。正如上面提到的,你必須啓用LazyLoading和ProxyCreating。即使在啓用LazyLoading和ProxyCreating後,我也遇到了這些問題。此外,請確保您聲明您的導航屬性爲virtual,否則EF將無法加載實體懶惰。

所以我遇到的問題是EF沒有裝箱代理,因爲我的實體沒有沒有參數的公共或受保護的構造函數。創建公共(在我的情況下保護)構造函數沒有參數後,它的工作。

注意:沒有公共/保護構造函數沒有參數不會影響急切加載。

Here is a link that explains the requirements for the LazyLoading

1

使用Include()方法實現了急切的加載,因此您使用Include("Books")強制加載加載。

更改此:

dbContext.Backpacks.Where(b=>b.Name!="").Include("Books").FirstOrDefault() 

這樣:

dbContext.Backpacks.Where(b=>b.Name!="").FirstOrDefault() 

您現在應該看到Books不再被即時加載。

參考:

  1. http://www.entityframeworktutorial.net/EntityFramework4.3/eager-loading-with-dbcontext.aspx
  2. https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx
+0

我知道Include會加載實體,我只是用Include來測試它,看它是否有效。如果我嘗試在不使用包含的情況下加載揹包,那麼我沒有在導航列表中獲取書籍。 – Dilshod

+0

@Dilshod你需要發佈更多的代碼。你對男性問題的描述絕對沒有意義。 – Seany84

3

手頭的資料有限,我可以看到你的問題如下解釋。

延遲加載或代理創建禁用

確保延遲加載和代理的創建已啓用,先不沒有後者的工作。

dbContext.Configuration.ProxyCreationEnabled = true; 
dbContext.Configuration.LazyLoadingEnabled = true; 

(見this SO post瞭解詳細信息)

處置上下文

簡化後訪問實體,延遲加載是這樣的:

  • 每當你從上下文檢索實體,您實際上會得到您預期覆蓋virtual導航屬性的類的自動創建子類的對象,這是代理
  • 無論何時您訪問所述導航屬性,代理將訪問數據庫並在需要時加載鏈接的實體。

最後一步,當然只是可能的,如果實體/代理仍連接到上下文,因此可以查詢檢索數據庫對象說。

using(var dbContext = new MyContext()) 
{ 
    dbContext.Configuration.ProxyCreationEnabled = true; 
    dbContext.Configuration.LazyLoadingEnabled = true; 
    // Note: You can modify or derive from `MyContext` so that this is 
    //  done automatically whenever a new `MyContext` is instantiated 

    var backpack = dbContext.Backpacks.Where(b=>b.Name!="").FirstOrDefault(); 

    // This should work 
    var firstBook = backpack.Books.FirstOrDefault(); 
} 

// This will probably not, because the context was already disposed 
var firstDrink = backpack.Drinks.FirstOrDefault(); 

我希望這可以幫助,但如果它不

+1

ProxyCreation默認啓用。我雖然被啓用使LazyLoad問題。所以在我的情況下,ProxyCreation已啓用,LazyLoading已啓用。我要去測試一些東西然後回來。 – Dilshod