EF Core 跟踪 vs AsNoTracking:什么时候查询能快一倍?

作者:微信公众号:【架构师老卢】
2-1 10:24
37

EF Core 默认会把查询出来的实体放进 ChangeTracker(跟踪器),这让你后续修改实体并 SaveChanges() 很方便。

但如果你的查询是纯读取(列表页、报表、只读接口),跟踪反而是一笔额外开销:

  • 更多内存
  • 更多 CPU(构建/维护跟踪图)

什么时候用 AsNoTracking

典型场景:

  • 只读 API / 查询列表
  • 报表、导出
  • 高并发读取
var users = await db.Users
    .AsNoTracking()
    .Where(x => x.IsActive)
    .ToListAsync(ct);

什么时候不要用

  • 你要把实体改完再保存(需要跟踪)
  • 你依赖导航属性 fix-up 行为(跟踪更方便)

小技巧

  • 局部用 AsNoTracking(),不要全局“一刀切”
  • EF Core 还有 AsNoTrackingWithIdentityResolution(),适合既想减少跟踪、又想避免重复实体实例的场景

参考链接

  • Tracking vs No-Tracking Queries:https://learn.microsoft.com/ef/core/querying/tracking
相关留言评论
昵称:
邮箱:
阅读排行