小弟是第一次接触EF这个ORM,在使用时发现甚是方便尽管有性能上的担忧。但是我现在接触到的都是简单使用,简单到我甚至不需要动脑子,所以一直在找深入使用的东西。偶然发现了一种AsNoTracking()的用法,尽管能够见名知意但我觉得还是有必要研究一下其具体意义。果不其然,它带我打开了深入理解EF的一扇门。
跟踪数据与非跟踪数据的内容,如果我能了解一些并合理使用的话,对我来说就算是EF学习的进步之一了,更何况还能优化EF使用性能。
下面大部分信息都来自于对他人文章的参考,本人仅作学习。


先说明白引诱我入坑的AsNoTracking()。

DBSet.AsNoTracking() 获取非跟踪数据

AsNoTracking 称之为获取不带变动跟踪的实体查询

在一些情况下,我们只需要查询返回一个只读的数据记录,而不会对数据记录进行任何的修改。这种时候不希望Entity Framework进行不必要的状态变动跟踪,可以使用Entity Framework的AsNoTracking方法来查询返回不带变动跟踪的查询结果。

using (var ctx = new PortalContext())
{foreach (var province in ctx.Provinces.AsNoTracking()){Console.WriteLine(province.ProvinceName);}
}

以上代码中使用AsNoTracking方法查询返回无变动跟踪的Province的DbSet,由于是无变动跟踪,所以对返回的Province集中数据的任何修改,在SaveChanges()时,都不会提交到数据库中。

AsNoTracking是定义在IQueryable中的扩展方法,所以也可以用于LINQ表达式查询。

using (var ctx = new PortalContext())
{var query = from p in ctx.Provinces.AsNoTracking()where p.ProvinceID > 10select p;foreach (var province in query){Console.WriteLine(province.ProvinceName);}
}

注:使用AsNoTracking需要添加引用命名空间using System.Data.Entity。


基于此进行拓展学习:

EF实体对象变动跟踪

Entity Framework 通过DbContext.ChangeTracker对实体对象的变动进行跟踪,实现跟踪的方式有两种:变动跟踪快照和变动跟踪代理。

  • 变动跟踪快照:前面几篇随笔的示例都是通过实体对象变动快照跟踪来实现数据操作的,POCO模型不包含任何逻辑去通知Entity Framework实体类属性的变动。Entity Framework在第一次对象加载到内存中时进行一次快照,添加快照发生在返回一次查询或添加一个对象到DbSet中时。当Entity Framework需要知道对象的变动时,将先把当前实体与快照中的对象进行扫描对比。实现扫描对比的方法是调用DbContext.ChangeTracker的DetectChanges方法。
  • 变动跟踪快照:前面几篇随笔的示例都是通过实体对象变动快照跟踪来实现数据操作的,POCO模型不包含任何逻辑去通知Entity Framework实体类属性的变动。Entity Framework在第一次对象加载到内存中时进行一次快照,添加快照发生在返回一次查询或添加一个对象到DbSet中时。当Entity Framework需要知道对象的变动时,将先把当前实体与快照中的对象进行扫描对比。实现扫描对比的方法是调用DbContext.ChangeTracker的DetectChanges方法。

Entity Framework Code First中能够自动调用DbContext.ChangeTracker.DetectChanges的方法:

  • DbSet.Add
  • DbSet.Find
  • DbSet.Remove
  • DbSet.Attach
  • DbSet.Local
  • DbContext.SaveChanges
  • DbContext.GetValidationErrors
  • DbContext.Entry
  • DbChangeTracker.Entries
  • 任何在DbSet上进行LINQ的查询
  1. 控制什么时间调用DetectChanges

大部分的实例对象的变动调整需要在Entity Framework进行SaveChanges时才会知道,但也可以根据需要调用变动跟踪获取当前对象的状态。

Entity Framework Code First的DbContext.DetectChanges在检测实例对象的变动时,大部分情况不会有性能的问题。但当有大量的实例对象在内存中,或DbContext有大量的操作时,自动的DetectChanges行为可能会一定程度的影响性能。

Entity Framework提供关闭自动的DetectChanges的功能,在需要的时候进行手动调用。如果考虑内存中的跟踪数量太大问题,就可以手动跟踪。

using (var ctx = new PortalContext())
{ctx.Configuration.AutoDetectChangesEnabled = false;var province = ctx.Provinces.Find(1);province.ProvinceName = "测试";Console.WriteLine("Before DetectChanges:{0}", ctx.Entry(province).State);ctx.ChangeTracker.DetectChanges();Console.WriteLine("After DetectChanges:{0}", ctx.Entry(province).State);
}
// 运行结果
Before DetectChanges:Unchanged
After DetectChanges:Modified
  1. 获取不带变动跟踪的实体查询
    为上文AsNoTracking所述,不再重复。
  2. 单个实体的变动跟踪信息及操作
    使用状态属性
using (var ctx = new PortalContext())
{var province = ctx.Provinces.Find(10);DbEntityEntry<Province> entry = ctx.Entry(province);Console.WriteLine("Before Edit: {0}", entry.State);province.ProvinceName = "Test";ctx.ChangeTracker.DetectChanges();Console.WriteLine("After Edit: {0}", entry.State);
}
// 运行结果
Before Edit: Unchanged
After Edit: Modified

注:DbEntityEntry需要引用命名空间using System.Data.Entity.Infrastructure;


PS:以上内容为我觉得常用的功能,想要看更多可以去看下面我的转载来源连接。
转载自:EF实体对象变动跟踪

EF-AsNoTracking()相关推荐

  1. ef core mysql 字符集,EF Core 基础知识

    数据库连接字符串 在 ASP.NET Core 添加配置片段: { "ConnectionStrings": { "BloggingDatabase": &qu ...

  2. [bug]不包含“AsNoTracking”的定义

    摘要 在使用ef做查询优化的时候我们会用到AsNoTracking方法,但如果不引入命名空间,你就会出现不包含"AsNoTracking"的定义的错误. 解决办法 引入命名空间:S ...

  3. 你必须知道的EF知识和经验

    推荐MiniProfiler插件 工欲善其事,必先利其器. 我们使用EF和在很大程度提高了开发速度,不过随之带来的是很多性能低下的写法和生成不太高效的sql. 虽然我们可以使用SQL Server P ...

  4. mysql ef 随机排序_EFCore+Mysql倉儲層建設(分頁、多字段排序、部分字段更新)

    前沿 園子里已有挺多博文介紹了EFCore+Mysql/MSSql如何進行使用,但實際開發不會把EF層放在Web層混合起來,需要多個項目配合結構清晰的進行分層工作,本文根據個人實踐經驗總結將各個項目進 ...

  5. 【推荐】你必须知道的EF知识和经验

    阅读目录 推荐MiniProfiler插件 数据准备 foreach循环的陷进 AutoMapper工具 联表查询统计 性能提升之AsNonUnicode 性能提升之AsNoTracking 多字段组 ...

  6. sql注入pythonpoco_.NET EF(Entity Framework)详解

    一丶Entity Framework (一)EF简介 (1)ORM:Object Relation Mapping ,通俗说:用操作对象的方式来操作数据库. (2)插入数据库不再是执行Insert,而 ...

  7. EF Core的一个紧急bug,我这样修改

    1 背景 今日在生产环境碰到如下错误 ASP.NET MVC项目 Repository层中,Delete总是失败 another entity of the same type already has ...

  8. EF Core 6 简化的数据库上下文注册

    EF Core 6 简化的数据库上下文注册 Intro EF Core 6 将简化现在的服务注册,DbContext 的服务注册将会更简单一些 Sample 直接来看示例代码吧: 现在我们注册 EF ...

  9. 一些有关使用EF的错误用法展开的思考

    前言 这是一个对话性的讨论,它讨论了一个严重的问题趋势,我发现在由初级团队到架构师团队的各种规模的组织中,EntityFramework的利用率都很高. 这不是一个如何做的问题,这也不适合新手.如果有 ...

  10. 别跟我谈EF抵抗并发,敢问你到底会不会用EntityFramework

    前言 一直以来写的博文都是比较温婉型的博文,今天这篇博文算是一篇批判性博文,有问题欢迎探讨,如标题,你到底会不会用EntityFramework啊. 你到底会不会用EntityFramework啊 面 ...

最新文章

  1. 年中盘点:2021年最炙手可热的10家AI初创公司
  2. 开源大数据引擎:Greenplum 数据库架构分析
  3. 我也是一个线程,为什么每天累得像狗一样?
  4. ES6相关特性的整理(变量数据结构)
  5. mysql事务 brave,mysql 查询当天、本周,本月,上一个月的数据
  6. [2020.11.26NOIP模拟赛]勇者的后缀【SA,RMQ,主席树,二分】
  7. web开发项目,web前端CSS全局样式,面试必问
  8. 两张图告诉你tnsnames.ora 的配置详解
  9. 前端 相机 自定义取景框_索尼ZV-1数码相机:专业而易用,Vlog和网络主播的进阶良机...
  10. 树莓派3ftp服务器修改地址,树莓派3搭建ftp服务器
  11. Git分支简介与使用——Git的学习与使用(五)
  12. 转使用chrome命令行:disable-web-security 实现浏览器跨域
  13. Jetson TK1
  14. 小程序报错类—— thirdScriptError sdk uncaught third Error Cannot read property '$mount' of unde
  15. (华为社招岗位,部门---公共开发部,数字能源,计算,Carbu, 上海海思,GTS,海思,2012):上海!上海上海!
  16. 华为思科宣布全力布局,美国NSF巨资支持的NDN到底什么来头?
  17. 单点登录(4):单点登录实现(附源码)
  18. 【QTdesigner】课时37.按钮控件(QPushButton)【pyqt5+QTdesigner模式】
  19. Rosalind第18题——ros_bio18_ORF
  20. 【小程序】微信小程序集成环信im

热门文章

  1. 【DS with Python】 Pandas中Series DataFrame的结构、创建、查询、修改语法与实例
  2. CF981F Round Marriage
  3. LPC1768 PWM单边沿触发
  4. python梨视频爬虫下载,反反爬
  5. 查看及更改计算机名或域,如何查看和修改计算机名、域和工作组
  6. 手把手教你用Arduino接入阿里云物联网平台,ESP8266连接阿里云物联网平台必看教程...
  7. Mysql组复制(MGR)——技术细节
  8. C语言算法扩散墨水,66行C语言计算器,别忘了下载TC编译器!
  9. ios和android 浏览器适配问题总结
  10. 鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一)