EF6中针对非实体类型查询时AsNoTracking()的作用及是否可省略的疑问
EF6中针对非实体类型查询时AsNoTracking()的作用及是否可省略的疑问
嘿,这个问题问到点子上了!我来给你把这个逻辑捋明白~
首先得搞清楚EF6里AsNoTracking()的核心作用:它是用来告诉EF上下文,不要对查询出来的EF实体类型进行变更跟踪,也不要把这些实体缓存到上下文里。但你的场景有点特殊,咱们拆开来分析:
- 你的查询是通过
Select把Person实体的几个字段投影到了非实体类型PersonSimpleData(比如你说的record类)。EF6的变更跟踪系统只对它自己注册过的实体(也就是和DbSet<Person>绑定的那个Person类)生效,完全不会关心你自定义的这种简单DTO/record。 - 更关键的是,当你做这种投影查询时,EF6根本不会完整加载
Person实体实例到上下文里——它只会生成SQL查询你指定的三个列,然后直接把结果映射到PersonSimpleData对象。这时候上下文里从头到尾都没有创建过Person实体,那AsNoTracking()自然也就没有可以作用的对象了。
所以结论很明确:在你这个场景下,AsNoTracking()完全可以省略,加了也不会带来任何性能提升或者其他效果,因为本来就没有需要被取消跟踪的实体对象。
举个反例对比一下:如果你的查询是直接返回Person实体(比如myContext.Persons.AsNoTracking().ToArray()),那AsNoTracking()就很有用了——能避免上下文缓存这些实体,节省内存,也防止后续不小心提交了未预期的变更。但你的情况是投影到非实体,就完全没必要啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

