簡體   English   中英

在 EF 4.1 中加載所有導航屬性及其子項的最佳方式是什么

[英]What is the best way to load all navigation properties and their children in EF 4.1

我正在嘗試獲取一個List<EntityType> ,每個項目都有大約 15 個我需要加載的導航屬性,一些導航屬性有一個我也需要加載的導航屬性,這是一個示例代碼

class AA
{
  public EntityReference<B> Bobj
  {
     get;
     set;
  }
  public EntityCollection<C> CCollection
  {
     get;
     set;
  }
}
class B
{
  public EntityCollection<X> XCollection
  {
     get;
     set;
  }
}
class C
{
  public EntityReference<Y> YObj
  {
     get;
     set;
  }
}

List<AA> AList = Dbcontext.AAs.Where(a => a.ID==4).ToList();

我希望List<AA>中的每個項目都已加載其BObj及其XCollection以及所有CCollection項目及其YObj

我嘗試使用IncludeLoad加載它們,但我認為有一種優雅的方法可以做到這一點

我也嘗試將LazyLoadingEnabled設置為false但這不會加載完整的圖表我不知道為什么?

所以請我需要最好的方法來加載我的EntityType的完整圖表

我正在使用數據庫優先方法EF 4.1C# 4.0

這是我學到的一個巧妙的技巧:

List<AA> AList = Dbcontext.AAs.Where(a => a.ID==4)
    .Select(a => new {a, a.Bobj, a.CCollection})
    .ToList().Select(o => o.a).ToList();

Dbcontext.Bs.Where(b => b.A.ID==4)
    .Select(b => new {b, b.XCollection})
    .ToList();
Dbcontext.Cs.Where(c => c.A.ID==4)
    .Select(c => new {c, c.YObj})
    .ToList();

Entity Framework 將弄清楚這些不同的對象是如何連接的。 您將進行可管理的往返次數(在本例中為 3 次),並且生成的 SQL 查詢結果將具有相對較少的重復數據。

關閉延遲加載會阻止它們加載。 打開延遲加載並將所有導航屬性標記為虛擬,這將允許它們被覆蓋,以便可以創建動態代理。 這將允許延遲加載正常工作。 顯式加載也是一種選擇(許多人認為這是更好的編碼實踐)。

編輯:哦,我還以為是代碼優先,對不起。 然后,如果它有幫助,由於 Include 返回查詢 object,您實際上可以遍歷它們的列表並將它們添加到自身以動態構建查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM