[英]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;}
}
现在,您应该能够访问ChildActivities
的Documents
,而不必显式加载(通过Eager / Explicit loading )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.