【问题标题】:Self-referencing relationship in Entity Framework with child includes实体框架中与孩子的自引用关系包括
【发布时间】:2013-07-11 20:54:44
【问题描述】:

有没有办法在自引用关系中包含子对象。例如,我有一个这样的对象:

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 对象始终为空,有没有办法也包含这些?

【问题讨论】:

    标签: linq entity-framework relationship


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 我已经尝试过第一种方式,但由于某种原因仍然返回为空,所以我尝试了 lambda 方式并且有效,也很高兴知道这种方式,干杯
    【解决方案2】:

    一种方法是利用 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;}
    }
    

    您现在应该能够访问您的ChildActivitiesDocuments,而无需显式加载它们(通过Eager/Explicit loading)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多