EFCore.BulkExtensions —— 让 EF Core 起飞的批量操作利器

360影视 国产动漫 2025-08-29 09:40 3

摘要:在日常项目里,使用 EF Core 写 CURD 很方便,但当数据量一上来(比如一次要处理10万+ 行数据),性能就成了大问题。

在日常项目里,使用 EF Core 写 CURD 很方便,但当数据量一上来(比如一次要处理 10万+ 行数据),性能就成了大问题。

这时候,EFCore.BulkExtensions就能帮你一键提速,轻松解决 EF Core 原生 SaveChanges 的性能瓶颈。

db.Students.AddRange(students);
db.SaveChanges;

但 EF Core 实际上是逐条 insert,遇到 10 万数据时可能要等几十秒甚至几分钟

BulkExtensions 提供的BulkInsert能把这件事一次性塞进数据库,直接提升几十倍速度。

它支持的操作包括:

• BulkInsert批量插入 • BulkUpdate批量更新 • BulkDelete批量删除 • BulkRead批量查询 • BulkInsertOrUpdateUpsert(有则更,无则插) • BulkInsertOrUpdateOrDeleteSync(和输入列表完全同步) • BulkSaveChanges批量 SaveChangesdotnet add package EFCore.BulkExtensions

如果只用某个数据库,也可以选择更小的单独包:

• EFCore.BulkExtensions.SqlServer • EFCore.BulkExtensions.PostgreSql • EFCore.BulkExtensions.MySql • EFCore.BulkExtensions.Oracle • EFCore.BulkExtensions.Sqlite假设有一个Student实体:public class Student
{
public int Id { get; set; }
public string Name { get; set; } = "";
public int Age { get; set; }
}3.1 批量插入var students = Enumerable.Range(1, 100000)
.Select(i => new Student { Name = $"学生{i}", Age = 18 })
.ToList;

db.BulkInsert(students);

插入 10万条数据只要几秒

3.2 批量更新var list = db.Students.Where(s => s.Age 20).ToList;
list.ForEach(s => s.Age++);
db.BulkUpdate(list);3.3 批量删除var olds = db.Students.Where(s => s.Age > 25).ToList;
db.BulkDelete(olds);3.4 Upsert(插入或更新)db.BulkInsertOrUpdate(students);操作 EF Core 100K BulkExtensions 100K Insert 11s 3s Update 8s 4s Delete 50s 3s

适用场景:当数据量 > 1000 行时,建议优先考虑 Bulk 操作。

5.1 获取自增主键db.BulkInsert(students, new BulkConfig
{
SetOutputIdentity = true
});

会把数据库生成的自增 ID 回写到对象里。

5.2 批量操作 + 事务using var tran = db.Database.BeginTransaction;
db.BulkInsert(students);
db.BulkUpdate(students);
tran.Commit;5.3 批量清空表db.Truncate比DELETE在大数据导入、日志入库、定时同步等场景下,EFCore.BulkExtensions是一个性价比极高的工具

来源:opendotnet

相关推荐