c# - AsNoTracking 上下文属性、查询或 ChangeTracker?

标签 c# .net-core entity-framework-core

我注意到可以通过三种不同的方式禁用跟踪:

  • 通过上下文属性上的 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.

换句话说,如果查询返回实体并且没有AsNoTrackingAsTracking在查询表达式树中调用 anywhere,查询使用 ChangeTracker.QueryTrackingBehavior 的值.

所以你的问题的答案是肯定的,你可以通过对最终查询的一次调用或通过 ChangeTracker 实现相同的效果。 .

不过有一点需要注意,文档中没有解释。如果查询表达式树包含多个AsNoTracking/AsTracking调用,最后 调用优先。这意味着通过添加 AsNoTracking或者如果您添加 AsTracking最终查询将控制它的行为,而不管任何内部跟踪行为调用或 ChangeTracker属性(property)。

关于c# - AsNoTracking 上下文属性、查询或 ChangeTracker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52400940/

相关文章:

c# - EF Core 7 - 仅包含未删除的项目

sql - 带有EF Core和内存数据库提供程序的原始SQL

c# - EF Core,通过从字符串进行 int 转换在 SQL 服务器上执行

c# - ASP.NET 应用程序的磁盘空间不足

c# - 将图标添加到我完成的应用程序

C#/.NET - 如何自动生成和增加包版本,尤其是通过 CI?

c# - Docker 在 VS 中运行,但在发布到 AWS 时出错?错误 CS5001 : Program does not contain a static 'Main' method suitable for an entry point

c# - Linq 语法 Any()

c# - 如何在不使用反射的情况下访问一系列类的公共(public)属性

c# - 在 .NET Core 2.1 中使用通用主机正常关闭