Entity Framework中的惰性加载项

3
我有两个对象彼此之间具有多对多的关系。 我正在使用数据库优先的Entity Framework。 我的数据库分析器显示,每当我获取一个A对象集合时,它会为A中的每个元素加载B对象集合。我认为采用惰性加载时不会发生这种情况,或者只有在通过导航属性访问时才会获取B对象集合。 访问对象的代码采用通用方法,其中entities是我的DbContext。
public virtual IQueryable<T> GetAll()
{
    IQueryable<T> query = entities.Set<T>();
    return query;
}

两个导航属性都被实现为virtual ICollection<T>,我在DbContext构造函数中明确设置了Configuration.LazyLoadingEnabled = true

我是否遗漏了什么或者方法不对?我应该删除导航属性,并通过其他查询显式加载所需内容吗?


我将 LazyLoadingEnabled 设置为 false,但是 B 集合没有被加载,所以我不确定原因是什么。 - Andrew Burgess
调用 ToList() 方法会导致 IQueryable 的延迟加载被执行吗?没有使用调试器,只使用 SQL Server Profiler,我可以看到每个 A 对象都选择了 B 对象,而我实际上并没有在任何地方使用导航属性。 - Andrew Burgess
但这听起来更像是急切加载。你的查询中是否使用了 Include - Slauma
不,这是我在问题中指定的查询(只是entities.Set<T>())。 - Andrew Burgess
我不认为Set应该在未枚举的情况下实现集合。某些东西正在枚举您的集合(导致枚举器MoveNext())。ToList,.AsEnumerable()和其他一些东西都可能会导致这种情况。在调试器中进行检查也会枚举,因此这并不总是一个好方法来检查。如果您没有看到任何导致枚举的方法或循环,请尝试将其作为IEnumerable<T>而不是IQueryable<T>返回。 - kappasims
显示剩余2条评论
1个回答

0
在专家面前,我有些不好意思问这个问题 :) 但是,在这种情况下,将DbContext上的ProxyCreationEnabled=false设置是否有帮助呢?如果这个问题太“新手”了,请原谅。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,