【发布时间】:2015-09-23 08:46:31
【问题描述】:
在实体框架中,我知道您可以将属性设置为虚拟以使其加载过于延迟,这很棒。但在我的服务代码中,我想加载一个孩子列表,以及每个孩子的列表。
我可以在 2 次点击中加载数据,而不是让实体框架加载这些数据。
这是我的课程的一个例子
public class Parent
{
public long Id { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
public class Child
{
public long Id { get; set; }
public long ParentId { get; set; }
public ICollection<GrandChild> { get; set; }
}
public class GrandChild
{
public long Id { get; set; }
public long ChildId { get; set; }
public virtual AnotherClass AnotherProperty { get; set; }
}
在我的服务代码中,我正在加载这样的数据,因为我看不到能够一次加载所有数据(也许我只是不知道正确的查询语法)
var parent = await _context.Parents
.Where(e => e.Id == 9)
.Include(e => e.Children)
.FirstOrDefaultAsync();
var grandchildren = await _context.GrandChildrens
.Where(e => e.Child.ParentId == 9)
.ToListAsync();
// this is load again?
foreach (var child in parent.Children)
child.GrandChildren = (from a in grandChildren where a.ChildId == child.Id).ToList();
现在每次我尝试设置child.GrandChildren 时,实体框架都会尝试加载数据。如何阻止它加载数据,但不删除 virtual 关键字,就像在其他情况下一样,我希望实体框架延迟加载。
另外,如果有人知道如何在 1 个查询中加载父、子、孙子,也请告诉我
【问题讨论】:
-
如果您希望一次加载所有实体,那么您应该立即加载它们。
-
在这种情况下,这就是我想要做的,但是当我设置属性时,实体框架正在尝试加载它们。如果我让实体框架加载列表,它将导致 3 个连接,就像我这样做一样,我可以在 2 中完成。这是一个示例,在较大的对象上,我可以在比实体框架少得多的连接中加载数据
-
你不应该关心连接,因为 ADO 使用连接池。
标签: c# .net entity-framework entity-framework-6