我注意到可以通过三种不同的方式禁用跟踪:
- 通过上下文属性上的
AsNoTracking
- 在执行最终查询之前通过
AsNoTracking
- 通过
context.ChangeTracker.QueryTrackingBehavior
如果我想禁用对所有内容的跟踪,这三种方法之间有什么区别吗?
如果我之前在每个上下文属性之后使用了 AsNoTracking
,现在我只用对最终查询的一次调用替换它(或通过 ChangeTracker
禁用它),它会不会效果一样吗?
最佳答案
AsNoTracking
和 AsTracking
是 IQueryable<T>
的扩展方法, 因此与查询的状态而不是特定实体相关联(它们在 DbSet<T>
级别可用的事实只是因为它实现了 IQueryable<T>
) - 注意 all 里面的词方法说明:
无跟踪
Returns a new query where the change tracker will not track any of the entities that are returned.
追踪
Returns a new query where the change tracker will keep track of changes for all entities that are returned.
两者都说:
The default tracking behavior for queries can be controlled by QueryTrackingBehavior.
换句话说,如果查询返回实体并且没有AsNoTracking
或 AsTracking
在查询表达式树中调用 anywhere,查询使用 ChangeTracker.QueryTrackingBehavior
的值.
所以你的问题的答案是肯定的,你可以通过对最终查询的一次调用或通过 ChangeTracker
实现相同的效果。 .
不过有一点需要注意,文档中没有解释。如果查询表达式树包含多个AsNoTracking
/AsTracking
调用,最后 调用优先。这意味着通过添加 AsNoTracking
或者如果您添加 AsTracking
最终查询将控制它的行为,而不管任何内部跟踪行为调用或 ChangeTracker
属性(property)。
关于c# - AsNoTracking 上下文属性、查询或 ChangeTracker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52400940/