文章目录
前言
在 Entity Framework Core (EF Core) 中高效执行批量新增、修改和删除操作,需结合原生功能与优化策略。
一、批量新增数据
方法 1:使用 AddRange + SaveChanges
-
原理:一次性添加多个实体,通过单次数据库提交减少开销。
-
示例:
var persons= new List<Person> { new Person { Name = "Tom" }, new Person { Name = "Jack" } }; context.persons.AddRange(persons); context.SaveChanges(); // 生成一条 INSERT 语句(EF Core 7+)
方法 2:ExecuteInsert(EF Core 7+)
-
直接执行批量插入,无需跟踪实体:
var persons = new List<Person> { new Person { Name = "Tom" }, new Person { Name = "Jack" } }; context.Persons.ExecuteInsert(persons);
性能优化:
-
分批插入:每批 100-1000 条,避免内存和锁竞争:
foreach (var batch in persons.Chunk(500)) { context.AddRange(batch); context.SaveChanges(); context.ChangeTracker.Clear(); // 清除跟踪以释放内存 }
二、批量修改数据
方法 1:自动变更跟踪
缺点:逐条生成 UPDATE,性能低(EF Core 7 前)。
-
修改已加载的实体,依赖 ChangeTracker 检测变更:
-
示例:
var persons = context.Persons.Where(u => u.Age < 18).ToList(); foreach (var person in persons) { person.Status = "Inactive"; } context.SaveChanges(); // 生成 UPDATE 语句
方法 2:ExecuteUpdate(EF Core 7+)
-
直接执行批量更新,无需加载实体:
-
示例(生成 SQL:UPDATE [T_Persons] SET [Status] = ‘Inactive’ WHERE [Age] < 18):
context.Persons .Where(u => u.Age < 18) .ExecuteUpdate(setters => setters.SetProperty(u => u.Status, "Inactive") );
场景选择:
- 少量数据 → 变更跟踪。
- 大批量数据 → ExecuteUpdate(高效,减少数据传输)。
三、批量删除
方法 1:RemoveRange + SaveChanges
-
示例:
var inactivePersons = context.Person.Where(u => u.Status == "Inactive").ToList(); context.Person.RemoveRange(inactivePerson); context.SaveChanges(); // 生成 DELETE 语句
-
缺点:逐条删除(EF Core 7 前)
方法 2:ExecuteDelete(EF Core 7+)
-
直接执行批量删除,无需加载实体:
-
示例(生成 SQL:DELETE FROM [T_Persons] WHERE [Status] = ‘Inactive’):
context.Persons .Where(u => u.Status == "Inactive") .ExecuteDelete();
四、性能优化建议
1) 使用 EF Core 7+ 批量操作
- ExecuteInsert/ExecuteUpdate/ExecuteDelete 直接生成高效 SQL,避免实体跟踪。
2)第三方扩展库
-
EF Core.BulkExtensions 或 Z.EntityFramework.Plus:
// 示例:使用 BulkExtensions context.BulkInsert(users); context.BulkUpdate(users); context.BulkDelete(users);
优势:支持超大数据量(10万+条),底层使用 SqlBulkCopy。
3)关闭跟踪提升性能
-
示例
context.ChangeTracker.AutoDetectChangesEnabled = false; // 执行批量操作 context.ChangeTracker.AutoDetectChangesEnabled = true;
4)显式事务控制
-
示例:
using (var transaction = context.Database.BeginTransaction()) { try { // 批量操作 context.SaveChanges(); transaction.Commit(); } catch { transaction.Rollback(); } }
总结
EF Core 7+:优先使用 ExecuteInsert/ExecuteUpdate/ExecuteDelete。
旧版本:结合 AddRange/RemoveRange 与分批提交,或使用扩展库。
超大数据量:选择第三方库(如 EF Core.BulkExtensions)或原生 SQL。