EFCore.BulkExtensions 简介

EntityFrameworkCore扩展:批量操作(插入,更新,删除,读取,更新,同步)和批处理(删除,更新)。

库是轻量级的,并且非常高效,具有所有最常用的CRUD操作。

在Microsoft推荐的EFcore扩展 Top 20。

当前版本使用的是EF Core 3.1,目前支持Microsoft SQL Server(2008+)和SQLite。

它针对NetStandard 2.0,因此可以用于针对NetCore(2.0+)或NetFramework(4.6.1+)的项目。

3.1.0和3.0.0之间的版本使用的是EF Core 3.0,并且以NetStandard 2.1为目标,因此只能在NetCore(3.0+)上使用。

3.0之前的版本(最后2.6.4)针对NetStandard 2.0,可以与NetCore(2.2)或NetFramework(4.6.1+)一起使用。

EFCore / v.Nuget:EFCore2.1 / v2.4.1 EFCore2.0 / v2.0.8,对于EF Core 1.x,请使用1.1.0(以NetStandard 1.4为目标)

请使用SqlBulkCopy进行插入,更新/删除合并具有原始Sql的 MERGE BulkInsert 。

对于SQLite,没有BulkCopy,而是库将普通SQL与UPSERT结合使用。

批量测试不能具有UseInMemoryDb,因为InMemoryProvider不支持特定于关系的方法。

在新版nuget上,用软件包管理器控制台命令安装:

Install-Package EFCore.BulkExtensions

用法

用法非常简单明了。

批量扩展是在DbContext类上进行的,可以像这样使用(支持常规和异步方法):

context.BulkInsert(entitiesList); context.BulkInsertAsync(entitiesList);

context.BulkUpdate(entitiesList); context.BulkUpdateAsync(entitiesList);

context.BulkDelete(entitiesList); context.BulkDeleteAsync(entitiesList);

context.BulkInsertOrUpdate(entitiesList); context.BulkInsertOrUpdateAsync(entitiesList); //Upsert

context.BulkInsertOrUpdateOrDelete(entitiesList); context.BulkInsertOrUpdateOrDeleteAsync(entitiesList); //Sync

context.BulkRead(entitiesList); context.BulkReadAsync(entitiesList);

context.Truncate(); context.TruncateAsync();

批处理扩展是在IQueryable DbSet上进行的,可以在以下代码段中使用。

它们以纯sql的形式完成,并且不检查某些对象是否已预先装入内存并被跟踪。(updateColumns是可选参数,其中的PropertyNames在我们需要更新为其默认值时明确添加)

// Delete

context.Items.Where(a => a.ItemId > 500).BatchDelete();

context.Items.Where(a => a.ItemId > 500).BatchDeleteAsync();

// Update (using Expression arg.) supports Increment/Decrement

context.Items.Where(a => a.ItemId <= 500).BatchUpdate(a => new Item { Quantity = a.Quantity + 100 });

// can be as value '+100' or as variable '+incrementStep' (int incrementStep = 100;)

// Update (via simple object)

context.Items.Where(a => a.ItemId <= 500).BatchUpdate(new Item { Description = "Updated" });

context.Items.Where(a => a.ItemId <= 500).BatchUpdateAsync(new Item { Description = "Updated" });

// Update (via simple object) - requires additional Argument for setting to Property default value

var updateColumns = new List { nameof(Item.Quantity) }; // Update 'Quantity' to default value('0'-zero)

var q = context.Items.Where(a => a.ItemId <= 500);

int affected = q.BatchUpdate(new Item { Description = "Updated" }, updateColumns);//result assigned to variable

批量操作

直接使用这些操作时,每个操作都是独立的事务,并且会自动提交。

如果我们需要在单个过程中执行多个操作,则应使用显式事务,例如:

using (var transaction = context.Database.BeginTransaction())

{

context.BulkInsert(entitiesList);

context.BulkInsert(subEntitiesList);

transaction.Commit();

}

对于SQLite,BulkConfig中还有其他属性:{SqliteConnection,SqliteTransaction}通过以下方式使用显式事务:

using (var connection = (SqliteConnection)context.Database.GetDbConnection())

{

connection.Open();

using (var transaction = connection.BeginTransaction())

{

var bulkConfig = new BulkConfig() { SqliteConnection = connection, SqliteTransaction = transaction };

context.BulkInsert(entities, bulkConfig);

context.BulkInsert(subEntities, bulkConfig);

transaction.Commit();

}

}

当需要进行两项操作但与数据库建立一个连接时,可以使用BulkInsertOrUpdate方法。

当PK(PrimaryKey)匹配时,它进行更新,否则插入。

BulkInsertOrUpdateOrDelete有效地将表行与输入数据同步。

在列表中找不到的Db中的那些将被删除。

BulkRead根据Config中指定的一个或多个“唯一”列进行SELECT和JOIN UpdateByProperties。

性能

以下是性能(对于SQL Server以秒为单位):

Operations\Rows

100,000 EF

100,000 EFBulk

1,000,000 EFBulk

Insert

38.98 s

2.10 s

17.99 s

Update

109.25 s

3.96 s

31.45 s

Delete

7.26 s

2.04 s

12.18 s

—————–

————

—————-

——————

Together

70.70 s

5.88 s

56.84 s

TestTable有6列(Guid,string,string,int,decimal?,DateTime)。

全部插入,其中2个(字符串,DateTime)已更新。

测试是在以下配置下本地完成的:INTEL Core i5-3570K 3.40GHz,DDRIII 8GB x 2,SSD 840 EVO 128 GB。

对于小型数据集,这会产生开销,因为大多数Bulk op都需要创建Temp表并在完成后将其删除。最好的建议是将Bulk ops用于大于1000的集合。

EFCore.BulkExtensions

https://github.com/borisdj/EFCore.BulkExtensions

efcore 批量_EFcore使用EFCore.BulkExtensions 批量增加、删除、修改相关推荐

  1. php mysql增改删_PHP分享:如何实现MySQL的增加删除修改查看

    原标题:PHP分享:如何实现MySQL的增加删除修改查看 各位朋友,大家上午好! 今天给大家带来的是 如何实现MySQL的增加删除修改查看! 这里就需要用到一个PHP MySQL的增加删除修改查看的类 ...

  2. java 解析/操作 xml 几种常用方式 xml的增加/删除/修改

    java 解析/操作 xml 几种常用方式 xml的增加/删除/修改 首先,我们先介绍几种常用的xml解析器. 1. 介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方 ...

  3. JPA学习笔记---JPA数据的操作:增加,删除,修改,获取,使用JPQL进行查询

    JPA学习笔记---JPA数据的操作:增加,删除,修改,获取,使用JPOL进行查询 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技 ...

  4. jquery(js) 增加 删除 修改属性样式、元素内容

    引入jquery.js 1.增加或修改样式 $('#id').css('display','none');--根据id设置隐藏 2.$("#id").css({"back ...

  5. 工作中遇到的问题--使用注解进行增加删除修改的验证

    自定义验证的注解: /**  * This constraint is to be put on object level for which need to validate on the Prod ...

  6. 数据库简介、SQL 语的增加删除修改查询命令

    一.数据库简介 1.使用数据库的必要性 A.结构化存储大量数据,便于高效的检索和访问 B.有效地保持数据信息的一致性.完整性,降低数据冗余 C.满足数据共享和安全方面的要求 2.数据 描述事物的符号记 ...

  7. vue element 表格增加删除修改数据

    这里用到是设置一个弹出框来实现此功能,还有一种方法是直接在原来的基础上面进行修改 效果如下: 表格的table: <el-table :data="tableData" st ...

  8. Sql增加,删除,修改列及修改约束

    查看约束条件 MySQL: SELECT * FROM information_schema.TABLE_CONSTRAINTS where table_name = 'book'; Oracle: ...

  9. 微信小程序——数组操作 (增加删除修改遍历)map、filter、forEach、find的用法、二维数组,排序,求和、指定长度数组赋值

    一.数组的操作 Array.push() ->在数组后面继续插入内容 Array.pop() ->拿走数组最后一个内容 Array-shift()->拿走数组的第一个内容 (unsh ...

最新文章

  1. ini配置文件的读取
  2. Gson源码解析和它的设计模式
  3. 13.QT信号槽的连接方式
  4. SVN服务端的搭建及客户端连接(云上搭建服务端)
  5. 加法器 编码器 译码器 显示译码器
  6. include element into ABAP word document
  7. java执行多次post请求_同样的post请求代码在Java和android中执行结果不同。
  8. 新风系统风速推荐表_谈实验室通风系统设计
  9. Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子
  10. 内存及Cache带宽测试
  11. Linux 查看显卡型号
  12. html5小球互相碰撞,HTML5相互碰撞散开的小球
  13. HTML 代码混淆与压缩
  14. 关于photoshop软件的177个小技巧
  15. easyui下拉框值改变
  16. 董老师走进斯坦福讲座
  17. 【分享视频资源】React JS教程
  18. elementUI表格自动刷新
  19. 【调剂经验】19年一战东南大学计算机专硕调剂蒙纳士,初复试经验调剂经验分享!...
  20. 真实操作Robotstudio解决机器人系统创建失败(更改用户名),不需要重装系统,修改注册表复杂操作

热门文章

  1. sql基于聚合结果集取最大值_SQL超入门第三篇:写给产品、运营、分析师的SQL教程...
  2. mysql 交换空间_MySQL优化纪录
  3. SentOS 7防火墙配置与端口增删改查的命令
  4. mysql默认存储引擎的索引结构是_InnoDB引擎的索引和存储结构
  5. opencv ppt效果_opencv几何图形画法
  6. 触发更新机制_王者荣耀1.14更新:11名英雄调整,韩信加强,鲁班大师重做
  7. 利用计算机语言进行并行性描述,有没有一种语言可以利用大规模并行计算机?...
  8. 深入理解JVM(4)——对象内存的分配策略
  9. jenkins 忘记用户名和密码
  10. 20165236 2017-2018-2 《Java程序设计》结对编程练习_四则运算