场景:
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
}