摘要:在日常项目里,使用 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