Context.Entry.Reference.Load 加载返回对象内的所有引用



场景:

public class A{
public B InstanceOfB { get; set; }
}
public class B{
public string Name { get; set; }
public virtual ICollection<A> ListOfA { get; set; }
}
public void Boo(){
using (var db = new myContext()){
var instanceOfA = db.A.Find(1);
db.Entry(instanceOfA).Reference(a => a.InstanceOfB).Load();
}
}

在我的数据库上下文中,我关闭了ProxyCreationEnabled并打开了LazyLoadEnabled。

当我使用Load时,属性ListOfA的引用也会加载,并且它是递归的。

如何防止此行为?

在您的方案中,启用了延迟加载。任何检查ListOfA的尝试都将导致 EF 尝试延迟加载该集合。如果db仍在范围内,它将加载(如果没有,你将获得异常(。

你在注释中指示你正在检查调试器中的值,因此这就是触发加载的原因。

您可以在发出 SQL 命令时轻松观察它们,在检查集合时观察初始加载和后续延迟加载。看

如何在程序中记录从 DbContext.SaveChanges(( 生成的 SQL?

如果要确保始终加载子集合,即使在对象离开db范围之后,也可以执行以下操作:

using System.Data.Entity; // Needed for the delegate form of .Include(...)
using (var db = new myContext())
{
var instanceOfA = db.A
.Include(a => a.InstanceOfB)
.Include(a => a.InstanceOfB.ListOfA)
.First(); // Or .Where(...) depending on needs
}

最新更新