AsNoTrackingWithIdentityResolution()的用途、适用场景及通俗解析
AsNoTrackingWithIdentityResolution() 是什么?该什么时候用? 先从你熟悉的 AsNoTracking() 说起,帮你把两者的区别和用途讲明白:
核心用途
AsNoTracking() 能让EF跳过实体跟踪,提升查询性能,但有个明显的小问题——如果查询结果里出现同一条数据库记录(比如同一个用户被多个关联订单带出来),EF会给每条记录都新建一个对象实例。而 AsNoTrackingWithIdentityResolution() 就是来解决这个问题的:
- 它保留了
AsNoTracking()的性能优势:不长期跟踪实体,没有跟踪带来的额外开销 - 同时在查询过程中临时维护一个小型缓存,遇到主键相同的实体时,直接复用已经创建好的实例
- 查询结束后这个临时缓存就被丢弃,不会像跟踪查询那样长期占用内存
- 最终效果:同一条数据库记录在查询结果里不管出现多少次,都返回同一个对象引用,既省内存,判断实体是否为同一对象时还能直接比引用,不用挨个对比属性
和AsNoTracking()的直观对比
举个实际例子:查询10个属于用户张三的订单,用 AsNoTracking() 的话,每个订单里的User属性都是全新的对象——内容完全一样,但内存里是10个独立实例;用 AsNoTrackingWithIdentityResolution() 的话,所有订单里的User都是同一个对象引用,内存里只存一份张三的实体数据。
适合使用的场景
- 关联查询的只读场景:比如查订单+关联用户、查文章+关联作者,同一个关联实体可能多次出现,你需要这些实体保持引用一致,同时又不需要修改保存这些数据(不需要启用跟踪)。
- 内存敏感的大数据查询:如果查询返回大量数据,且里面包含不少重复实体,用这个方法能减少内存中的对象数量,避免不必要的内存浪费。
- 需要引用一致但不想用跟踪查询:跟踪查询会让EF长期持有实体引用,可能导致内存占用过高,或者不小心提交意外修改,这种只读场景下用这个方法刚好平衡性能和引用一致性。
一句话总结
想要 AsNoTracking() 的查询速度,又不想接受“同一条数据库记录返回多个重复对象实例”的问题,就用 AsNoTrackingWithIdentityResolution()。
内容的提问来源于stack exchange,提问作者Pepe Alvarez
相关产品推荐
相关产品推荐

