efcore 批量_EFcore使用EFCore.BulkExtensions 批量增加、删除、修改
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 批量增加、删除、修改相关推荐
- php mysql增改删_PHP分享:如何实现MySQL的增加删除修改查看
原标题:PHP分享:如何实现MySQL的增加删除修改查看 各位朋友,大家上午好! 今天给大家带来的是 如何实现MySQL的增加删除修改查看! 这里就需要用到一个PHP MySQL的增加删除修改查看的类 ...
- java 解析/操作 xml 几种常用方式 xml的增加/删除/修改
java 解析/操作 xml 几种常用方式 xml的增加/删除/修改 首先,我们先介绍几种常用的xml解析器. 1. 介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方 ...
- JPA学习笔记---JPA数据的操作:增加,删除,修改,获取,使用JPQL进行查询
JPA学习笔记---JPA数据的操作:增加,删除,修改,获取,使用JPOL进行查询 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技 ...
- jquery(js) 增加 删除 修改属性样式、元素内容
引入jquery.js 1.增加或修改样式 $('#id').css('display','none');--根据id设置隐藏 2.$("#id").css({"back ...
- 工作中遇到的问题--使用注解进行增加删除修改的验证
自定义验证的注解: /** * This constraint is to be put on object level for which need to validate on the Prod ...
- 数据库简介、SQL 语的增加删除修改查询命令
一.数据库简介 1.使用数据库的必要性 A.结构化存储大量数据,便于高效的检索和访问 B.有效地保持数据信息的一致性.完整性,降低数据冗余 C.满足数据共享和安全方面的要求 2.数据 描述事物的符号记 ...
- vue element 表格增加删除修改数据
这里用到是设置一个弹出框来实现此功能,还有一种方法是直接在原来的基础上面进行修改 效果如下: 表格的table: <el-table :data="tableData" st ...
- Sql增加,删除,修改列及修改约束
查看约束条件 MySQL: SELECT * FROM information_schema.TABLE_CONSTRAINTS where table_name = 'book'; Oracle: ...
- 微信小程序——数组操作 (增加删除修改遍历)map、filter、forEach、find的用法、二维数组,排序,求和、指定长度数组赋值
一.数组的操作 Array.push() ->在数组后面继续插入内容 Array.pop() ->拿走数组最后一个内容 Array-shift()->拿走数组的第一个内容 (unsh ...
最新文章
- ini配置文件的读取
- Gson源码解析和它的设计模式
- 13.QT信号槽的连接方式
- SVN服务端的搭建及客户端连接(云上搭建服务端)
- 加法器 编码器 译码器 显示译码器
- include element into ABAP word document
- java执行多次post请求_同样的post请求代码在Java和android中执行结果不同。
- 新风系统风速推荐表_谈实验室通风系统设计
- Opencv图像边缘检测——Roberts算子(手写)、Sobel算子(手写和调包)、Scharr算子、Laplacian算子
- 内存及Cache带宽测试
- Linux 查看显卡型号
- html5小球互相碰撞,HTML5相互碰撞散开的小球
- HTML 代码混淆与压缩
- 关于photoshop软件的177个小技巧
- easyui下拉框值改变
- 董老师走进斯坦福讲座
- 【分享视频资源】React JS教程
- elementUI表格自动刷新
- 【调剂经验】19年一战东南大学计算机专硕调剂蒙纳士,初复试经验调剂经验分享!...
- 真实操作Robotstudio解决机器人系统创建失败(更改用户名),不需要重装系统,修改注册表复杂操作
热门文章
- sql基于聚合结果集取最大值_SQL超入门第三篇:写给产品、运营、分析师的SQL教程...
- mysql 交换空间_MySQL优化纪录
- SentOS 7防火墙配置与端口增删改查的命令
- mysql默认存储引擎的索引结构是_InnoDB引擎的索引和存储结构
- opencv ppt效果_opencv几何图形画法
- 触发更新机制_王者荣耀1.14更新:11名英雄调整,韩信加强,鲁班大师重做
- 利用计算机语言进行并行性描述,有没有一种语言可以利用大规模并行计算机?...
- 深入理解JVM(4)——对象内存的分配策略
- jenkins 忘记用户名和密码
- 20165236 2017-2018-2 《Java程序设计》结对编程练习_四则运算