推荐关注「码侠江湖」星标,时刻不忘江湖事

这是 EF Core 系列的第七篇文章,上一篇文章讲述了 EF Core 中的实体数据修改。

这篇文章讲一讲 EF Core 如何进行批量操作。

在众多的 ORM 框架中,EF Core 的功能并不是最强大的那个,性能可能也不是最好的那个。但却一直是最稳定、最安全,扩展能力最强、使用人数最多的那个。

虽然在性能方面,在 EF Core 6.0 中已经得到了非常大的提升。

但是在功能方面, EF Core 一直有一个不完善的地方,就是它不能很好的支持数据的批量操作,也就是批量删除和批量更新。

所以这篇文章就先从比较常用的批量删除和批量更新讲起。

点击上方或后方蓝字,阅读 EF Core 系列合集。

批量操作

在 EF Core 中批量更新和删除数据,都需要先进行查询,把数据加载到内存中,然后再对数据操作,最后再SaveChanges 保存到数据库。

我们来看这个示例:

var accounts = _context.Accounts.Where(account => account.Age >= 1);foreach (var a in accounts)
{a.Age = a.Age + 1;
}_context.SaveChanges();

为了更新 Accounts 中实体的 Age 属性,我们必须查询出所有符合条件的实体集合,然后用遍历的方式,在内存中去逐个修改实体的 Age 属性。

最后,通过 SaveChanges 方法保存修改。

运行程序,结果如下图所示:

通过控制台日志可以发现,前后总共执行了 3 条 SQL 语句,1 条 Selet 语句和 2 条 Uptete 语句。

第一条 Selet 语句,是为了查询出所有符合条件的数据,由于数据库中只有 2 条数据,所以后面 2 条 Uptete 语句,是针对这 2 条数据的更新操作。

如果我们把更新操作换成删除操作,EF Core 也会如此去做。

大家可以想象一下,如果批量更新或者删除的数据量比较大,那么这样的操作,性能无疑是非常底下的。

因此,我们需要一种在 EF Core 中,只使用一条 SQL 语句,就可以批量删除或更新数据的方法。

由于这个功能确实比较常用,很多其它第三方的 ORM 框架,几乎也都支持这个操作。

但为什么作为 ORM 框架大佬的 EF Core,却不提供这个功能呢?

简单来说,EF Core 的开发团队认为,这样做会导致 EF Core 的对象状态跟踪混乱。

比如对于同一个上下文类,如果用批量删除的方法删除了数据,那么在被删除之前,查询出来的数据状态就混乱了。

毕竟,EF Core 是一个成熟且安全性高的 ORM 框架,必然会考虑潜在风险的存在。

如果想要完美实现,可能需要重构 EF Core 的代码,工作量方面会比较大。

但是,我们作为开发者,完全可以根据场景需求,来规避这些问题的存在。

比如在一个 Web 应用中,删除操作通常都是在一个 HTTP 请求中完成的,不同的 HTTP 请求上下文是不同的,所以基本不会涉及到 EF Core 开发团队担心的问题。

即便在某些特殊场景下,涉及到在同一个上下文里,数据删除之前就把数据查询出来的场景,那也完全可以通过在删除之后,再重新查询一次的方式,来规避这个问题。

未来 EF Core 会不会添加这个功能,我们不得而知,但我们也有自己的解决方法。

第一个解决方法,就是执行原生 SQL 语句,不过它的缺点我们在前面的文章中已经提过,就不再多说。

第二个解决方法,是使用第三方的 ORM 框架,比如 FreeSQL、SugarSQL,它们都提供了批量更新和批量删除的功能,使用起来也非常简单。

不过,这种方法的缺点就是必须在项目替换掉 EF Core ,使用第三方的 ORM 框架。

目前 EF Core 是 .NET 中,使用率最高的 ORM 框架,主打安全性与稳定性,而且 6.0 版本性能也得到了大量的改善,所以不建议轻易更换。

第三个解决方法,就是使用 EF Core 的扩展插件,由于 EF Core 在全球范围有着最多的用户基数,所以也形成了一个强大的生态环境,拥有很多的第三方扩展。

这同样也是第三方 ORM 框架,所无法比拟的地方。

我们可以在 EF Core 的官方文档,查阅到被官方收集的第三方扩展插件和工具。

这里面支持批量操作的扩展插件有两个:「EFCore.BulkExtensions」「Entity Framework Plus」

它们都支持最新的 EF Core,更新也比较稳定。

不同的是,E「FCore.BulkExtensions」 功能专一,仅扩展了批量操作方面的功能,同时也支持 「SqlBulkCopy」,也就是大数据量的批操作。

由于 「SqlBulkCopy」 只支持 SQLServer 和 SQLite ,所以 「EFCore.BulkExtensions」 只支持 SQLServer 和 SQLite。

「EF Plus」 功能更加强大,扩展了更多的查询功能,它分为免费版和收费版,基础的批量操作免费版就可以支持,高级批量操作以及 SqlBulkCopy 则只有收费版支持。

如果使用的是 MySQL,或者不需要 SqlBulkCopy,那么 「EF Plus 免费版」是首选,因为它支持更多的数据库,扩展了更丰富的查询功能。

安装好 EF Plus,这里我将刚才批量更新的操作,改为 EF Plus 来实现:

<PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="6.13.19" />
_context.Accounts.Where(account => account.Age >= 1).Update(account => new Account {Age = account.Age + 1},update => update.Executing = command => Console.WriteLine(command.CommandText));

Update 就是 EF Plus 扩展的方法,它的第一个参数是要更新的数据,第二个参数是一个执行拦截器委托,这里用来打印准备执行的 SQL 语句。

现在运行程序,可以在控制台中看到:

执行的是 1 条 UPDATE 语句,这条 SQL 语句会更新所有 Accounts 中符合条件的 Age 字段。

除了批量更新,批量删除也同样简单。

更多的示例,大家可以看 EF Plus 的官网文档。

更多精彩内容,请关注我▼▼

如果喜欢我的文章,那么

在看和转发是对我最大的支持!

(戳下面蓝字阅读)
  • ASP.NET 6 中间件系列

  • ASP.NET 最通俗易懂的依赖注入系列

  • 查缺补漏系统学习 EF Core 6  系列

  • 老子不亏是程序员的祖师爷

  • 不得不知的超精简 HTTP 协议

推荐关注微信公众号:码侠江湖

觉得不错,点个在看再走哟

查缺补漏系统学习 EF Core 6 - 批量操作相关推荐

  1. 查缺补漏系统学习 EF Core 6 - 原始 SQL 查询

    推荐关注「码侠江湖」加星标,时刻不忘江湖事 这是 EF Core 系列的第五篇文章,上一篇文章盘点了 EF Core 中的几种数据查询方式. 但是有有时候,我们可能无法用标准的 LINQ 方法完成查询 ...

  2. 查缺补漏系统学习 EF Core 6 - 数据查询

    这是 EF Core 系列的第四篇文章,上一篇文章讲述了 EF Core 中的实体迁移与数据播种. 这篇文章盘点一下 EF Core 的几种数据查询方式,内容较多分上下两篇. 点击上方或后方蓝字,阅读 ...

  3. 查缺补漏系统学习 EF Core 6 - 软删除与编译查询

    这是 EF Core 系列的第八篇,也是系列的最后两篇章节,所以就讲一讲 EF Core 的一些扩展知识:软删除.显式编译查询.IQueryable 和 IEnumerable. 这篇文章就先说一说软 ...

  4. I2C总线学习—查缺补漏—S3C2440的I2C控制器

    I2C总线学习-查缺补漏-S3C2440的I2C控制器                  学习了IIC总线协议的理论部分,觉得应该学习具体操作2440的IIC控制器,毕竟最终都是为了学习S3C2440 ...

  5. I2C总线学习—查缺补漏—应答信号ACK

    I2C总线学习-查缺补漏-应答信号ACK           IIC协议规定,当主机作为接收设备时,主机对最后一个字节不应答,以向发送设备(从设备)标识数据传送结束.这是因为每次传输都应得到应答信号后 ...

  6. I2C总线学习—查缺补漏—对数据有效性的思考

    I2C总线学习-查缺补漏-对数据有效性的思考 IIC协议规定:SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化.IIC期间在脉冲上升沿把数据放到SDA上, ...

  7. EFCore查缺补漏(二):查询

    相关文章: EFCore查缺补漏 第 20 轮 TechEmpower 评测结果出炉了,ASP.NET Core 的 Plaintext 成绩名列前茅,带着 EFCore 的测试却在 Single q ...

  8. 赫斌老师数据结构视频查缺补漏笔记

    赫斌老师数据结构视频查缺补漏笔记 观看学习赫斌老师数据结构的视频,记录下自己之前学习这块内容时似懂非懂的知识,仅针对自己查缺补漏使用 视频链接:<郝斌老师数据结构自学视频> 1.指针的大小 ...

  9. 「查缺补漏」高频考点浏览器面试题

    前言 想要成为一名合格的前端工程师,掌握相关浏览器的工作原理是必备的,这样子才会有一个完整知识体系,要是「能参透浏览器的工作原理,你就能解决80%的前端难题」. 这篇梳理的话,更多的是对浏览器工作原理 ...

最新文章

  1. 40 JavaScript中的高阶函数
  2. 线程中应该注意的问题
  3. 实现简单的网页间的跳转
  4. Linux文件属性和权限
  5. python 指针_python入门指针
  6. Oracle入门(五A)之conn命令
  7. 一套PumpLinx泵阀仿真分析攻略
  8. 万年历插件软件测试,万年历软件测试方案.docx
  9. 扎克伯格引领的硅谷“裸捐”风
  10. Steam 网络联机配置代码
  11. ZYNQ图像处理(4)——灰度图像转二值化图像
  12. flutter检测网络状态
  13. Allegro基本规则设置指导书之Physical规则设置
  14. 老司机 iOS 周报 #36 | 2018-09-17
  15. 开机后黑屏看不到桌面_电脑开机后桌面黑屏不显示怎么办
  16. 各种嵌入式操作系统介绍
  17. 书架:以书会友,以友博书,分享读书乐趣。
  18. 电子警察原理大揭秘 注意!不被电子警察拍照的秘密(图解)
  19. LeCun指明下一代AI方向:自主机器智能
  20. linux dd 虚拟机,[教程]制作Linux的DD包

热门文章

  1. TikTok运营指南到此
  2. [附源码]Java计算机毕业设计SSM防疫期社区人员信息动态管理系统
  3. YMFC小四轴 众筹已成功 需要的朋友可联系我
  4. 289页初中级前端题助你拿下Offer
  5. java ganglia_分布式监控数据采集系统Ganglia实战
  6. STM32CubeIDE开发(三十), 如何结合RT-Thread开发STM32程序
  7. MWC2018 大会5G成大热门 中国芯大有可为
  8. 2023哈工大计算机考研经验贴
  9. 如何迁移git仓库,gitee仓库迁移到gitlab
  10. js根据字符串时分秒获取总秒数和分割时分秒