繁体   English   中英

Entity Framework中带有子项的自引用关系包括

[英]Self-referencing relationship in Entity Framework with child includes

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

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-> Documents对象始终为null,是否也可以包含这些对象?

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

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

此处不需要显式的Include("ChildActivities") ,因为EF会自动包括所有包含在最终最终导航属性路径上的实体。

顺便说一句:如果您使用的是EF> = 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;

一种方法是利用实体框架的延迟加载功能。

您需要通过将virtual关键字添加到导航属性中来稍微更改对象,以便它们满足创建POCO代理的 EF 要求

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;}
}

现在,您应该能够访问ChildActivitiesDocuments ,而不必显式加载(通过Eager / Explicit loading )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM