预先加载和导航属性
本文关键字:导航 属性 加载 | 更新日期: 2023-09-27 18:32:29
var ret = (from f in context.foo
join b in context.bar on f.barid = b.barid
select f).ToList();
我的返回列表包含所有具有barId的foos,它还包含所有导航属性。我的意思是,
context.foo.mark
填充,即使我没有明确包含它,也没有在查询期间访问它。我打开了延迟加载,为什么会发生这种情况?
为了详细说明我的问题,不知何故,我的相关实体正在从上述查询加载。我很好奇这是怎么发生的,我启用了延迟加载并且我没有访问任何相关对象
延迟装载检查是一种"catch-22"类型的问题。启用延迟加载后,只要上下文仍在运行,即使从调试器调用属性也会加载结果。此外,如果上下文仍从其他查询打开,EF 将自动维护这些对象的状态并包含它们。
我能想到的确定它是否被延迟加载的唯一真正方法是检查发送到数据库的 SQL 代码。
首先,将此行添加到 DbContext 构造函数中:
this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); //remove in production
然后,照常运行代码(但不要在调试器中停止检查对象)。查看调试控制台并检查所做的 SQL 调用。我敢打赌SQL不会包含相关属性。
如果再次运行代码,并停止调试器以检查对象属性,则应在调试控制台中看到另一个 SQL 调用提取相关实体。