Entity Framework AsNoTracking() 无限导航 属性

Entity Framework AsNoTracking() Infinite Navigation Property

我有这样的实现:

var query = this.DbContext.Set<T>();

if (includeProperties != null && includeProperties.Any())
{
    foreach (var includeProperty in includeProperties)
    {
        if (!String.IsNullOrEmpty(includeProperty))
        {
            query = query.Include(includeProperty);
        }
    }
}

return await query.Where<T>(predicate).ToListAsync();

我想进行此查询 AsNoTracking() 我想知道在哪里打电话很重要 AsNoTracking()?

如果我把它放在这里有什么不同吗:

var query = this.DbContext.Set<T>().AsNoTracking();

或此处:

return await query.Where<T>(predicate).AsNoTracking().ToListAsync();

两者执行查询 .AsNoTracking() 的方式是否相同?

此外,如果 .Include() 也受到这些 .AsNoTracking() 中任何一个的影响,我也很感兴趣,或者我是否必须像这样添加额外的 .AsNoTracking()

query = query.Include(includeProperty).AsNoTracking();

我在使用 .Include() 时遇到了问题,因为我得到了无限递归导航属性,而在使用 Automapper 时我得到了 Whosebug,所以我不太确定我是否正确使用 AsNoTracking()(或 AsNoTracking() 不会影响属性的无限嵌套,尽管我在某处读到过,但只跟踪 Context 的变化以进行进一步的 CUD 操作?)

我的 Context 子类中也有这些:

this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;

虽然我的主要问题是无限导航 属性 引用,但如果有人也能从问题的开头解释 AsNoTracking() 的正确用法,我将不胜感激(尽管,例如,它不与问题无关)。

谢谢。

不,在哪里调用并不重要AsNoTracking()。基本上它所做的就是在内部 ObjectQuery 上设置 ObjectQuery.MergeOption(和一些其他属性),所以在实际查询执行之前在哪里做并不重要。

是的,所有 Includeed 实体也不会被上下文跟踪。

不,LazyLoadingEnabled = falseProxyCreationEnabled = falseAsNoTracking()不会解决所有你的无限递归问题,尤其是在使用包含时。寻找如何使用自动映射器正确映射此类递归实体,在 EF 端做任何事情都无济于事。