EF Core 批量新增、修改、删除


前言

在 Entity Framework Core (EF Core) 中高效执行批量新增、修改和删除操作,需结合原生功能与优化策略。


一、批量新增数据

方法 1:使用 AddRange + SaveChanges

  1. 原理:一次性添加多个实体,通过单次数据库提交减少开销。

  2. 示例

    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+)

  1. 直接执行批量插入,无需跟踪实体:

    var persons = new List<Person> 
    { 
    	new Person { Name = "Tom" },
        new Person { Name = "Jack" }
     };
    context.Persons.ExecuteInsert(persons);
    

性能优化:

  1. 分批插入:每批 100-1000 条,避免内存和锁竞争:

    foreach (var batch in persons.Chunk(500))
    {
        context.AddRange(batch);
        context.SaveChanges();
        context.ChangeTracker.Clear(); // 清除跟踪以释放内存
    }
    

二、批量修改数据

方法 1:自动变更跟踪

缺点:逐条生成 UPDATE,性能低(EF Core 7 前)。

  1. 修改已加载的实体,依赖 ChangeTracker 检测变更:

  2. 示例:

    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+)

  1. 直接执行批量更新,无需加载实体:

  2. 示例(生成 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")
        );
    

场景选择:

  1. 少量数据变更跟踪
  2. 大批量数据ExecuteUpdate(高效,减少数据传输)。

三、批量删除

方法 1:RemoveRange + SaveChanges

  1. 示例

    var inactivePersons = context.Person.Where(u => u.Status == "Inactive").ToList();
    context.Person.RemoveRange(inactivePerson);
    context.SaveChanges();  // 生成 DELETE 语句
    
  2. 缺点:逐条删除(EF Core 7 前)

方法 2:ExecuteDelete(EF Core 7+)

  1. 直接执行批量删除,无需加载实体:

  2. 示例(生成 SQL:DELETE FROM [T_Persons] WHERE [Status] = ‘Inactive’):

    context.Persons
        .Where(u => u.Status == "Inactive")
        .ExecuteDelete();
    

四、性能优化建议

1) 使用 EF Core 7+ 批量操作

  1. ExecuteInsert/ExecuteUpdate/ExecuteDelete 直接生成高效 SQL,避免实体跟踪。

2)第三方扩展库

  1. EF Core.BulkExtensionsZ.EntityFramework.Plus

    // 示例:使用 BulkExtensions
    context.BulkInsert(users);
    context.BulkUpdate(users);
    context.BulkDelete(users);
    

优势:支持超大数据量(10万+条),底层使用 SqlBulkCopy

3)关闭跟踪提升性能

  1. 示例

    context.ChangeTracker.AutoDetectChangesEnabled = false;
    // 执行批量操作
    context.ChangeTracker.AutoDetectChangesEnabled = true;
    

4)显式事务控制

  1. 示例

    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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值