7

我有這樣的實體:EF代碼優先:如何加載相關數據(父 - 子 - 孫)?

public class DynamicPage { 

    public int PageId { get; set; } 

    public int Order { get; set; } 

    public string MenuText { get; set; } 

    public string MenuHover { get; set; } 

    public int? ParentId { get; set; } 

    public virtual DynamicPage Parent { get; set; } 

    public virtual ICollection<DynamicPage> Children { get; set; } 
} 

這個實體可以有3個級別:父 - >子 - >孫。如何加載父級(級別1)惠益所有關聯的孩子(級別2)和每個孩子,關聯的孫子(級別3)(如果有的話)?感謝幫助。

回答

10

EF 4.1功能和語法:

var entity = context.Parents 
    .Include(p => p.Children.Select(c => c.GrandChildren)) 
    .FirstOrDefault(p => p.Id == 1); // or whatever condition 
+0

沒有名爲'GrandChildren'的房產。你的意思是這個代碼:'Include(p => p.Children.Select(c => c.Children))'? –

+0

@Javad_Amiry:是的。其實,我寫的「GrandChildren」可以是任何導航屬性 - 收藏或參考。 'Include(x => x.SomeCollection.Select(c => c.SomeNavigationProperty))'模式只會導致下一級的Include。您可以重複該無限廣告:集合上的「選擇」,引用上的簡單點狀路徑。 – Slauma

+0

謝謝,只需幾分鐘,我就測試它 –

0

如果您想讓自己的生活變得輕鬆自如,請遵循EF Code First的慣例,將您的表ID簡稱爲Id(或者表名+ Id,例如DyanmicPageId)。

這應該離開你是這樣的:

public class DynamicPage 
{ 
    public int Id { get; set; } 
    public int Order { get; set; } 
    public string MenuText { get; set; } 
    public string MenuHover { get; set; } 
    public int? ParentId { get; set; } 

    public virtual DynamicPage Parent { get; set; } 
    public virtual ICollection<DynamicPage> Children { get; set; } 
} 

然後,你需要建立父母與子女間的關係,明確在OnModelCreating方法在DbContext類。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<DynamicPage>() 
     .HasMany(page => page.Children) 
     .WithRequired(child => child.Parent) 
     .HasForeignKey(child => child.ParentId); 
} 

然後,您可以選擇子女或孫子女需要:

var parent = dbContext.DynamicPages.Where(page => page.ParentId == null); 
var children = parent.Children; 
var grandchildren = parent.SelectMany(page => page.Children); 
var allRelatedPages = parent.Union(children).Union(grandchildren); 
+0

什麼是ü談論? Plz再次閱讀Q:**我如何將所有關聯的孩子(等級2)和每個孩子,關聯的孫兒(等級3)加載到父母(等級1)?如果有的話**我知道如何映射實體,以及知道如何以2級關係加載它們* Parent-Child *。但我無法加載3級關聯。只是這個! –

+0

「負載」是什麼意思?你的意思是選擇? – devuxer

+0

從數據庫加載,從數據庫獲取,選擇。像這樣:'entity.DynamicPages.Where(d => d.ParentId == null).Include(d => d.Children).ToList();'我知道這一點,但我想加載'd.Children。兒童',我不能): –