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单实例安装方式之图形方式
一 前言 我们在学习任何一个应用时,了解它的最初步骤通常是学会如何进行安装配置,后序才去关心如何使用,学习达梦数据库也是如此,而达梦数据库的安装提供了多种方式,接下来会一一介绍每种安装方式,达梦数据库 ...
随机推荐
- JavaScript – Web Worker
前言 在上一篇 << 单线程 与 执行机制 >> 中, 我们提到了 Web Worker. 它的诞生是为了解决 JS 主线程执行耗时计算时, 导致 UI 无法及时更新的卡死现象 ...
- MyBatisPlus——代码生成器
代码生成器 快速生成各项代码 步骤 创建Generator类,并创建main方法 创建代码生成器 AutoGenerator autoGenerator = new AutoGenerator(); ...
- 即刻报名 | Flutter Engage China 线上见!
在刚刚过去的 Flutter Engage 活动上,我们正式发布了 Flutter 2: 为任何平台创建美观.快速且可移植应用的能力得以更上一层楼.通过 Flutter 2,开发者可以使用相同的代码库 ...
- ARM SMMU中 SteamTable的作用
在 ARM SMMU(System Memory Management Unit)中,Stream Table 是一个非常关键的数据结构,它用于管理和映射设备的内存访问请求.它的作用主要体现在以下几个 ...
- linux中backport printk和front printk的区别
在Linux内核中,"backport printk"和"front printk"都是用于记录内核消息和调试信息的机制,但它们的工作方式和使用场景有一些区别. ...
- TX御加固脱壳
示例APP某小说 其实脱这个有好几个方法,我使用了两个方法都可以脱掉. 首先使用Y佬的APK测试: 上传文件后经过等待提示任务成功,把给的ZIP包下载下来. 解压后得到两个文件,txt文件是脱壳后的a ...
- iOS多项选项卡TYTabPagerBar和分页控制器TYPagerController使用小结
最近做项目的时候,用到了顶部选项卡和底部分页控制器相关的功能.之前做的话都是自己手动封装,通过两个UIScrollView联动来实现.公司同事给推荐了一个封装好的库, TYPagerControlle ...
- 介绍this指向问题
this是js底层定义的变量,代表了代码的指向环境 a 函数的this是window b 方法的this是调用的对象 c 构造函数和原型对象上的方法的this指向实例化对象 d 箭头函数不会自己创建t ...
- 3. 王道OS-操作系统的运行机制,中断和异常
1. 高级语言- 编译 - 机器指令 (二进制) 2. 内核态和用户态 :刚开机的时候CPU是内核态,当用户启动某个程序的时候CPU是用户态,如果遇到危险,操作系统会夺回CPU的控制权成为内核态,当危 ...
- HN CSP-J 2023 奇人鉴赏
其中有 4 位同学提到了IOI 一位同学提到了 fk,但是并没有 Fk CCF 共有52个 CCF,其中HN-J00157同学复制了很多遍题目一位同学用了ccf当 struct 名字,并且写出了人名函 ...