实体框架中与子代的自引用关系包括

时间:2013-07-11 20:54:44

标签: linq entity-framework relationship

是否有任何方法可以在自引用关系中包含子对象。例如,我有一个像这样的对象:

class Activity
{
    public int Id {get;set;}
    public String Name {get;set;}

    public IList<Document> Documents {get;set;}
    public IList<Activity> ChildActivities {get;set;}
}

我在linq中称之为:

from act in context.Activities.Include("Documents").Include("ChildActivities")
                      where act.Id == id
                      select act;

但ChildActivities - &gt; Documents对象总是为null,有没有包含这些的方法?

2 个答案:

答案 0 :(得分:4)

您可以使用“虚线路径”来包含更深层次的导航属性。对于您的示例,您可以写:

from act in context.Activities
    .Include("Documents")
    .Include("ChildActivities.Documents")
where act.Id == id
select act;

此处不需要显式Include("ChildActivities"),因为EF将自动包含所有实体,这些实体位于所包含的最终导航属性的路径中。

BTW:如果您使用的是EF&gt; = 4.1,那么您可以获得Include的强类型版本,它将lambda表达式作为参数:

using System.Data.Entity; // <- this namespace is required for the lambda-Include

//...

from act in context.Activities
    .Include(a => a.Documents)
    .Include(a => a.ChildActivities.Select(ca => ca.Documents))
where act.Id == id
select act;

答案 1 :(得分:0)

一种方法是利用Entity Framework的Lazy Loading功能。

您需要通过在导航属性中添加virtual关键字来稍微更改对象,以便它们符合EF requirements for creating POCO proxies

public class Activity
{
    public int Id {get;set;}
    public String Name {get;set;}

    public virtual IList<Document> Documents {get;set;}
    public virtual IList<Activity> ChildActivities {get;set;}
}

您现在应该可以访问Documents的{​​{1}},而无需明确加载它们(通过Eager/Explicit loading)。