EF6 LazyLoadingEnabled已启用但加载相关对象

时间:2014-08-06 11:45:46

标签: c# entity-framework lazy-loading

我在我的数据库中使用EF 6。 我调用构造函数ctx = new EntityContext()。然后尝试获取ctx.Set()例如。默认情况下,LazyLoadingEnabled = true。但是方法返回包含相关对象的集合。更重要的是,看起来对象是递归循环的。我做错了什么?为什么延迟加载不起作用? 我也启动了SQL分析器,我对它不是很熟悉,但...... 我在profiler中开始监控,然后启动测试应用程序......我看到的唯一请求是对我的表的请求,而没有其他请求到相关表。 请求看起来像:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name], 
[Extent1].[CreateDate] AS [CreateDate], 
[Extent1].[Type] AS [Type], 
[Extent1].[Status] AS [Status]
FROM [dbo].[Task] AS [Extent1]

这就是全部,但调试器显示具有相关对象的实体。为什么这样?

1 个答案:

答案 0 :(得分:1)

我认为这里的问题不是EF加载相关对象,而是加载它们!

如果您正在查看VS中调试器中的集合,那么您将展开一个集合,EF将查询数据库中的相关集合(就像您在代码中一样)。

如果您在执行此操作时观察SQL事件探查器,您应该看到它并在此时执行第二个查询。

EF通过动态代理工作,在调试器中扩展集合相当于在代码中处理对象,并调用MyObject.TheCollectionProperty.ToList()

延迟加载只是意味着填充相关集合所需的SQL不会被执行,除非您尝试访问相关集合(而不是使用连接的单个前期查询)。 有时这是可取的,有时这不是。这取决于您的应用程序逻辑如何工作。