实体框架中的AsNoTracking()

19 entity-framework

我使用AsNoTracking()并知道在使用它时禁用了第一级缓存.但如何利用AsNoTracking()提高性能呢?使用它有什么好处?

luk*_*san 39

AsNoTracking()表示ObjectContext实例不会在本地缓存实体.这有一些实际的好处:

  1. 内存使用:由于ObjectContext在返回给你之后没有引用实体,垃圾收集器可以在你不再引用它们时立即删除它们.通常,在此情况发生之前需要处理ObjectContext.

  2. 性能:由于EF不必尝试将数据库返回的每个记录与身份映射中的本地实体进行匹配,因此查询执行速度可能会稍快一些.

  3. 货币:由于查询返回直接从数据库结果实现的实体,并且不依赖于本地缓存,因此返回的实体应始终反映数据库中的最新值.

  4. 无状态:由于ObjectContext未跟踪实体,因此您可以继续无限期地使用相同的ObjectContext实例进行只读查询,并且不必受到关于具有短期ObjectContexts的常规建议的约束.

AsNoTracking()如果你只是查询实体,那是个好主意.如果你需要更新它们将无法工作,这是权衡.

  • 没有缓存/ AsNoTracking()可以使它变慢.从文档:"如果您在同一个上下文中反复查询相同的实体,实际上您可能会看到启用更改跟踪的性能优势." (2认同)