当属性设置为虚拟时,停止实体框架加载

本文关键字:实体 框架 加载 属性 设置 虚拟 | 更新日期: 2023-09-27 18:14:21

在实体框架中,我知道你可以设置一个属性为虚拟的,让它太懒加载,这是伟大的。但是在我的服务代码中,我想加载一个子列表,并且每个子列表中都有一个列表。

我可以在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查询,请让我知道太

当属性设置为虚拟时,停止实体框架加载

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

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

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