0

我想使用Entity Framework 4.2構建對象圖。EF4使用POCO在單獨查詢中獲取關聯

現在,我有POCO實體,使用ICollection作爲導航屬性。我想避免使用EntityCollection或任何EF特定的。

我想避免由於使用過大而導致的大量連接。給定一個對象,我想填充它的導航屬性,導致一個單獨的數據庫查詢。

有沒有辦法直接填充ICollection?現在,我正在解決這個問題,但這真的很痛苦。

// grab the user, brand users and brands 
User user = entities.Users 
        .Include(item => item.BrandUsers.Select(brandUser => brandUser.Brand)) 
        .Where(item => item.Name == userName) 
        .SingleOrDefault(); 
// grab the pending share grants and brands 
entities.Users 
     .Include(item => item.ToShareGrants.Select(shareGrant => shareGrant.Brand)) 
     .Where(item => item.Id == user.Id) 
     .Load(); 
return user; 

我不喜歡這種方法的一件事是我重新查詢頂層對象。如果我不這樣做,當沒有對象返回時,導航屬性不會被填充(留空)。例如,下面的代碼如果僅僅作品被返回的結果:

entities.ShareGrants 
     .Include(item => item.Brand) 
     .Where(item => item.ToUserId == user.Id) 
     .Load(); 

我很好奇,如果有隻是一個我是不是在實體框架意識到建立這些類型的關係的方法。如果有人知道一個簡單的方法來填寫導航屬性的步驟,我會很感激的代碼示例。

回答

0

簡短的回答這個問題是EF4沒有直接支持我想要的功能,不使用多個Include秒。爲了防止多次調用數據庫時大量加入並中斷結果,必須再次從數據庫中下載最頂層的實體。這意味着結果集中最左邊的列將是每個記錄重複的實體列。

0

嘗試關閉延遲加載當前的查詢,你可能只是把這個using塊

entities.ContextOptions.LazyLoadingEnabled = false; 
+0

我關閉了延遲加載和代理生成。看來Include是填充導航屬性的唯一方法。我正在尋找的是一種顯式加載導航屬性的方法(通過數據庫查詢)。 – 2012-01-27 01:02:42

0

你的問題不是很清楚。爲什麼在同一個查詢

User user = entities.Users 
     .Include(item => item.BrandUsers.Select(brandUser => brandUser.Brand)) 
     .Include(item => item.ToShareGrants.Select(shareGrant => shareGrant.Brand)) 
     .Where(item => item.Name == userName) 
     .SingleOrDefault(); 
+0

如果我使用多個Includes,它可能會導致大量連接。另外,根據需要,我可以有條件地構建對象圖的不同部分。 – 2012-01-27 00:52:52

+0

@TravisParks如果您不預先加載它們,則加載每個導航屬性將發出數據庫請求。每種方法都有其權衡,選擇最適合每種情況的方法。 – Eranga 2012-01-27 01:23:34

+0

我想要一個數據庫命中,在我的方案中。 – 2012-01-27 02:25:49