【问题标题】:Stop entity framework loading, when setting property as virtual将属性设置为虚拟时停止实体框架加载
【发布时间】: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


【解决方案1】:

我认为您可以像下面这样急切地加载相关实体:

var parent = await _context.Parents
    .Where(e => e.Id == 9)
    .Include(e => e.Children.GrandChildrens)
    .FirstOrDefaultAsync();

这应该加载父母、他们的孩子和他们的孙子。

【讨论】:

    猜你喜欢
    • 2013-01-24
    • 2015-12-13
    • 2016-05-29
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多