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。儿童',我不能): –