批量操作(Bulk Operations)是SQL中用于高效处理大规模数据的技术,可以显著提升数据操作的性能。如下面的SQL
-- SQL Server示例
BULK INSERT 表名
FROM '文件路径'
WITH (
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
);
批量操作的优势
性能提升:比单行操作快10-100倍
减少事务开销:单次操作处理大量数据
网络流量减少:客户端与服务器间通信次数减少
同理,我们在使用ABP框架的时候,面对万级别的数据批量操作,会变的很慢,此时就可以用三方的类库,来调用SQL的Bulk Insert
EFCore.BulkExtensions
EFCore.BulkExtensions就是本次介绍的工具,EFCore.BulkExtensions 是一个流行的 Entity Framework Core 扩展库,专门为 EF Core 提供高性能的批量操作功能,弥补了 EF Core 原生缺乏高效批量处理能力的不足。
引入
首先,我们需要引入EFCore.BulkExtensions
dotnet add package EFCore.BulkExtensions
基本用法
在获取到Context以后,可以按照以下方法批量操作
// 批量插入,也可以用对应的Async方法
context.BulkInsert(entitiesList);
// 批量更新,也可以用对应的Async方法
context.BulkUpdate(entitiesList);
// 批量删除,也可以用对应的Async方法
context.BulkDelete(entitiesList);
// 批量合并(UPSERT),也可以用对应的Async方法
context.BulkInsertOrUpdate(entitiesList);
注意点
1.不触发变更追踪:批量操作绕过EF的变更追踪机制
2.不执行验证:跳过模型验证逻辑
3.有限日志:相比原生操作,日志信息较少
4.版本兼容:需匹配EF Core版本
5.当表里有自增键的时候,还需要打开SetOutputIdentity的属性,具体操作如下:(此时我在批量插入TempZtgoogles一个数组)
await dbContext.BulkInsertAsync(TempZtgoogles, new BulkConfig
{
SetOutputIdentity = true // 如果需要返回自增ID
});
性能对比
操作类型 | EF Core 原生方式 | BulkExtensions | 速度提升 |
插入10,000条 | ~12秒 | ~0.3秒 | 40倍 |
更新10,000条 | ~15秒 | ~0.5秒 | 30倍 |
删除10,000条 | ~10秒 | ~0.2秒 | 50倍 |