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
被填充。我开启了延迟加载,为什么会出现这种情况?
要详细说明我的问题,我的相关实体以某种方式从上面的查询加载。我很好奇它是如何发生的,我启用了延迟加载而我没有访问任何相关的对象< /强>
答案 0 :(得分:1)
延迟装载检查是一种&#34; catch-22&#34;类型问题。启用“延迟加载”后,即使您的上下文仍然处于闲置状态,即使从调试器调用该属性也会加载结果。此外,如果您的上下文仍然从其他查询打开,EF将自动维护这些对象的状态并包含它们。
我能想到的唯一真正的方法是确定它是否被延迟加载是检查发送到数据库的SQL代码。
首先,将此行添加到DbContext构造函数中:
this.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); //remove in production
然后,正常运行您的代码(但不要在调试器中停止以检查您的对象)。查看调试控制台并检查所做的SQL调用。我敢打赌,SQL不会包含相关的属性。
如果再次运行代码并停止调试器检查对象属性,则应在调试控制台中看到另一个SQL调用,以获取相关实体。