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