GZY.EFCore.BulkExtensions 支持达梦数据库的EF Core批量操作库详解
EFCore.BulkExtensions是一个常用的EF core 批量处理数据的库.
但是支持的数据库相对较少.特别是.NET5.0版本 连MySQL都无法支持
这个库就是改造的最新EFCore.BulkExtensions的代码
让它能在.NET5.0中支持Mysql和达梦数据库
由于5.0在升到最新9.0的过程中有比较重大的改变,所以.NET8+的 我还在弄..估计后面支持吧
使用方法如下:
using (TestDbContext ctx = new TestDbContext())
{
List<Book> books2 = TestBulkInsert1.BuildBooks();
ctx.BulkInsert(books2); //批量插入 var book3 = ctx.Books.Take(1000).ToList();
ctx.BulkDelete(book3); //按实体批量删除
ctx.Books.Where(a => a.BookType == BookType.Fictional).BatchDelete(); //按条件删除 ctx.Books.Where(a => a.BookType == BookType.Scientific).BatchUpdate(a => new Book { Price = a.Price + 50, AuthorName = "gzy666" }); //批量按条件更新 var list = ctx.Books.Take(5000).ToList();
list.ForEach(a => a.AuthorName = "gzy8998");
ctx.BulkUpdate(list); //按实体批量更新
}
比较实用的是批量按实体进行修改、批量按实体删除、批量插入
7.0+虽然支持了按条件进行修改和删除但是批量处理 还是并未支持.
主要讲解一下两个数据库的实现原理吧
1.MySql的实现方式
1.1批量插入
这其实就不用介绍了,就是最常见的SqlBulkCopy的形式进行数据导入
优点就是量大管饱,速度快
缺点就是已经脱离了执行SQL的范畴,所以在实体监听这些处理会比较麻烦
注意:Mysql使用SqlBulkCopy需要开启local_infile功能,并需要在连接字符串中配置:AllowLoadLocalInfile=true;
1.2批量修改
采用了Mysql的 on duplicate key update 语法进行批量处理
首先会创建临时表,然后通过SqlBulkCopy将数据批量导入至临时表中
然后通过 解析实体产生 on duplicate key update 语法
类似如下SQL:
INSERT INTO my_table (column1, column2)
SELECT column1 FROM TempTableName AS EXCLUDED
ON DUPLICATE KEY UPDATE <column1> = <value1>, <column2> = <value2>;
它会通过主键来判断数据是否更新,然后从临时表中将数据更新过去
最后会删除临时表,(mysql也可以配置为会话临时表,这样就不用手动删除,会话结束了 会自动删除)
1.3批量删除
采用了 DELETE INNER JOIN 语法进行批量处理
同样也是将数据导入至临时表中,但是这里做了一些优化,只导入主键ID,因为删除只需要主键即可
最后会生成类似SQL:
DELETE A
FROM {tableInfo.FullTableName} AS A
INNER JOIN {tableInfo.FullTempTableName} B on A.{firstPrimaryKey} = B.{firstPrimaryKey};
这样就可以快速的进行批量删除.
2.达梦数据库的实现方式
2.1批量插入
其实国产的达梦数据库也提供了对应的SqlBulkCopy类,DmBulkCopy,我们直接按规范实现即可
(注意:达梦数据库的DmBulkCopy,暂时只提供了同步的方法,所以并不支持async异步处理)
2.2批量修改
批量修改的语法达梦就与Mysql差异较大了,但是也提供了对应的SQL
达梦采用 MERGE INTO的语法 可以从临时表中将数据批量更新至源表
2.3批量删除
批量删除也和Mysql大同小异
最后会生成类似如下SQL:
DELETE FROM
{tableInfo.FullTableName} AS A
WHERE A.{firstPrimaryKey} IN
(SELECT B.{firstPrimaryKey} FROM {tableInfo.FullTempTableName} AS B )
从临时表中根据主键删除源表的数据.
GZY.EFCore.BulkExtensions 支持达梦数据库的EF Core批量操作库详解的更多相关文章
- Activiti5.22.0扩展支持达梦数据库
前言 目前国内部分公司做的项目要求去ioe使用国产的替代方案.数据从异构数据库中迁移到达梦,应用中使用Activiti工作流在替换了数据库驱动后启动过程报错如下: nested exception i ...
- 基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作
由于一个客户朋友的需求,需要我的Winform开发框架支持国产达梦数据库的操作,这个数据库很早就听过,但是真正一般项目用的很少,一般在一些特殊的项目可能需要用到.由于我的Winform开发框架,是基于 ...
- mybatis plus 支持达梦DM 数据库啦
最近由于公司项目需要使用DM数据库,现在就官方源码修改了,完美支持达梦数据库的代码生成器.官方说的v3.0.RELEASE版本支持达梦数据库,不知道说的支持包括支持代码生成器么? 怀着兴奋的心情,兴高 ...
- 国产达梦数据库的结合Enterprise Library的应用开发
在上篇<基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作>介绍了如何在Enterprise Library的数据访问层上支持这种神秘的国产数 ...
- 达梦数据库产品支持技术学习分享_Week2
本周主要从以下几个方面进行本人对达梦数据库学习的分享,学习进度和学习情况因人而异,仅供参考. 一.文本命令行工具使用的方法(Disql和dmfldr) 二.数据库备份 三.定时作业功能 四.系统表和动 ...
- 达梦数据库产品支持技术学习分享_Week1
本周主要从以下几个方面进行本人对达梦数据库学习的分享,学习进度和学习情况因人而异,仅供参考. 一.达梦数据库的体系架构 二.达梦数据库的安装 三.达梦数据库的数据类型 四.达梦数据库的DDL.DML. ...
- DB 查询分析器 6.03 如何灵活、快捷地操作国产达梦数据库
DB 查询分析器 6.03 如何灵活.快捷地操作国产达梦数据库 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要 本文详细地介绍了"万能数据库查询分析器&qu ...
- .NETCore 访问国产达梦数据库
前言 武汉达梦数据库有限公司成立于2000年,为中国电子信息产业集团(CEC)旗下基础软件企业,专业从事数据库管理系统的研发.销售与服务,同时可为用户提供大数据平台架构咨询.数据技术方案规划.产品部署 ...
- [开源] .Net 使用 ORM 访问 达梦数据库
前言 武汉达梦数据库有限公司成立于2000年,为中国电子信息产业集团(CEC)旗下基础软件企业,专业从事数据库管理系统的研发.销售与服务,同时可为用户提供大数据平台架构咨询.数据技术方案规划.产品部署 ...
- Linux平台达梦数据库V7单实例安装方式之图形方式
一 前言 我们在学习任何一个应用时,了解它的最初步骤通常是学会如何进行安装配置,后序才去关心如何使用,学习达梦数据库也是如此,而达梦数据库的安装提供了多种方式,接下来会一一介绍每种安装方式,达梦数据库 ...
随机推荐
- MyBatisPlus——标准数据层开发
标准数据层开发 标准数据层CRUD功能 lombok 一个java类库,提供了一组注解,简化POJO实体类开发 常用注解@Data 为当前实体类在编译期设置对应的get/set方法,无参/ ...
- [TK] BLO
初步分析 此题描述让我们想到Tarjan求割点,因此我们从割点的角度来探讨一下这道题. 假如我们去掉的不是一个割点,那么它实际上不会对连通性造成影响,但是根据样例可以看出来,删去这个点导致了其余点与当 ...
- 简述 JavaScript脚本的执行原理?
js 是一种动态 . 弱类型 . 基于原型的语言 ,通过浏览器可以直接执行: 当浏览器遇到 <script></script>标记时 , 会执行标记之间的js 代码:然后js ...
- 9. JS的数据类型,区别
js 有2大数据类型分类 : 基本数据类型: 1. string 字符串 使用单.双引号包裹,或者使用反引号包裹 2. number 数字类型 3. boolean 布尔值 true false 4. ...
- 技术分享PPT整理(三):网页渲染流程
在我刚开始学习Web开发的时候,一直有个疑问--我写出的代码究竟是在什么时候发生作用的呢?是不是每次我修改代码网页都随之变化了?当然,现在来看这肯定是一个错误的想法,经过一段时间的工作和学习后,代码到 ...
- (系列八).net8 webApi后端框架轮子,欢迎下载。
说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...
- 为什么说Kafka还不是完美的实时数据通道
本文主要谈谈Kafka用于实时数据通道场景的缺陷,以及如何在架构上进行弥补. Kafka归属于消息队列类产品,其他竞品还有RabbitMQ.RocketMQ等,总的来说它们都是基于生产者.中介和消费者 ...
- Redhat7重置root管理员密码
如果要重置Red Hat Enterprise Linux Server release 7.0 的root常见有2种办法(均测试有效) rd.break方法 1.重启Linux系统主机并出现引导界面 ...
- (系列十)Vue3中菜单和路由的结合使用,实现菜单的动态切换(附源码)
说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...
- React h5架构
目录 目录 初始化项目架构 React h5架构 工具 技术栈 搭建流程 一.Vite构建项目 二.添加 git 三.运行项目 四.配置 Eslint 校验代码 五.配置 Prettier 格式化代码 ...