在EF 4.1中显式加载孙子集合

时间:2011-05-11 15:44:04

标签: .net entity-framework entity-framework-4.1

鉴于以下模型......

public class Parent
{
    public int Id { get; set; }
    public ICollection<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public ICollection<Grandchild> Grandchildren { get; set; }
}

public class Grandchild
{
    public int Id { get; set; }
}

...我们可以Include Parent 急切加载,所有ChildrenGrandchildren一步完成,如下所示:

context.Parents.Include(p => p.Children.Select(c => c.Grandchildren))

显式加载是否类似?

可以通过以下方式明确加载子集合:

Parent parent = context.Parents.Find(parentId);
context.Entry(parent).Collection(p => p.Children).Load();

但是尝试以与Include ...

类似的方式加载孩子
context.Entry(parent)
    .Collection(p => p.Children.Select(c => c.Grandchildren)).Load();

...不编译Collection ...

的字符串重载
context.Entry(parent).Collection("Children.Grandchildren").Load();

...抛出异常(“......不允许虚线路径......”)。

我发现唯一有效的方法是在循环中明确加载Grandchildren

Parent parent = context.Parents.Find(parentId);
context.Entry(parent).Collection(p => p.Children).Load();
foreach (var child in parent.Children)
    context.Entry(child).Collection(c => c.GrandChildren).Load();

我想知道我是否错过了某些内容以及是否有其他方法可以在一次往返中明确加载GrandChildren

提前感谢您的反馈!

1 个答案:

答案 0 :(得分:20)

正如我在评论中指出的那样,您可以先尝试查询关系,然后添加包含并执行加载。类似的东西:

context.Entry(parent)
       .Collection(p => p.Children)
       .Query()
       .Include(c => c.Grandchildren) // I'm not sure if you can include grandchild directly  
       .Load();