我有这样的实现:
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
时我得到了 stackoverflow
,所以我不太确定我是否正确使用了 AsNoTracking()
(或者 AsNoTracking()
不会影响属性的无限嵌套,尽管我在某处读到过,但是仅跟踪 Context
中的更改以进行进一步的 CUD 操作?)
我的 Context 子类中也有这些:
this.Configuration.LazyLoadingEnabled = false;
this.Configuration.ProxyCreationEnabled = false;
虽然我的主要问题是无限的导航属性引用,但如果有人也能从问题的开头解释 AsNoTracking()
的正确用法,我将不胜感激(尽管,例如,它不会与问题有任何关系)。
谢谢。
最佳答案
不,在哪里调用 AsNoTracking()
并不重要。基本上它所做的就是设置 ObjectQuery.MergeOption (和一些其他属性)在内部 ObjectQuery
上,因此在实际查询执行之前在哪里执行此操作并不重要。
是的,所有 Include
实体也不会被上下文跟踪。
不,LazyLoadingEnabled = false
、ProxyCreationEnabled = false
和 AsNoTracking()
将不会解决所有你的无限递归问题,特别是如果你使用包含。寻找如何使用自动映射器正确映射此类递归实体,在 EF 端做任何事情都无济于事。
关于c# - Entity Framework AsNoTracking() 无限导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43077800/