- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
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.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.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支持达梦数据库的EFCore批量操作库详解的文章就讲到这里了,如果你想了解更多关于GZY.EFCore.BulkExtensions支持达梦数据库的EFCore批量操作库详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
自动生成字段值,咱们首先想到的是主键列(带 IDENTITY 的主键)。EF Core 默认的主键配置也是启用 Identity 自增长的,而且可以自动标识主键。前提是代表主键的实体属性名要符合以下规
上次老周扯了有关主、从实体的话题,本篇咱们再挖一下,主、从实体之间建立的关系,跟咱们常用的一对1、一对多这些关系之间有什么不同。 先看看咱们从学习数据库开始就特熟悉的常用关系——多对多、一对
前言 基于EF Core + MySQL的基本增删改查,示例是基于 .NET6 + EF Core + MySQL 创建实体和数据库、EFCore 数据迁移 项目基础上的内容增加。同时也是
前言 EFCore.BulkExtensions是一个常用的EF core 批量处理数据的库. 但是支持的数据库相对较少.特别是.NET5.0版本 连MySQL都无法支持 这个库就是改造的
我试图在我的上下文类中设置一对一的外键关系,但我不断收到以下错误。我找到了一个 similar post但这似乎并没有解决我的问题,因为我在模型中明确指定了关系。我确认: Server 对象引用了一个
运行 dotnet ef migrations add XYZ将导致 a Migrations directory being created在项目中。这个目录是否应该提交给版本控制(Git 等)?
我试图围绕 EF Cores 拥有的对象以及如何控制何时加载某些数据块。 基本上我有一堆旧的遗留表(一些有大约 150 列),并希望使用一个根实体和每个表的几个拥有的对象对它们进行建模,以实现更好的分
我的模型包含 Post 和 PostHistory 类,其中 Post 与 PostHistory 具有一对多关系。 class Post { public int Id { get; set
我有一个 .Net Core WebApplication 项目,其中上下文类位于类库中。如果我在 OnConfiguring(DbContextOptionsBuilder optionsBuild
我正在尝试使用 Entity Framework Core 2.0.1 将现有的 PostgreSQL 数据库转换为实体,但在搭建脚手架时出现错误。数据库是通过运行以下脚本创建的: Script To
我在一个项目中有两个实体:SupplierFinishingItem 和 ProductOptionListItem。 ProductOptionListItem 通过导航属性引用另一个。 当我尝试创
我已经在 this 之后使用 .Net core 和 EFCore 创建了一个 API使用 VSCode 的教程。 我的 MySQL 数据库有很多模型,因为我正在“迁移”我的 EF6 和 asp.ne
目录 一 代码分析 1 GetTableName 2&n
我正在尝试根据实体特定字段中的搜索值列表来过滤实体。 例如: var searchValues = new List { "abc", "xyz" }; var posts = Context.Pos
我有一个在表中创建列的迁移。 public partial class AddName : Migration { protected override void Up(MigrationBu
Ef Core 接收错误 System.InvalidOperationException: Can't process set operations afterclient evaluation,
我有以下型号。在使用 find 方法从数据库中获取时,用子实体加载父实体的更好方法是什么? 父实体: public class Client { public int Id { get; se
我正在使用 EFCore 做一个原型(prototype),并努力寻找一种返回我刚刚添加到实体集合中的对象的好方法。 例如: public Songleader AddSongleader(int c
这个问题已经有答案了: How is Identity.EntityFramework OnModelCreating called (2 个回答) 已关闭12 个月前。 我知道当您创建迁移时它会被调
这个问题已经有答案了: How is Identity.EntityFramework OnModelCreating called (2 个回答) 已关闭12 个月前。 我知道当您创建迁移时它会被调
我是一名优秀的程序员,十分优秀!