首页 > 后端开发 > C++ > 在TransactionsCope中使用实体框架将4000记录插入数据库中的最快方法是什么?

在TransactionsCope中使用实体框架将4000记录插入数据库中的最快方法是什么?

Barbara Streisand
发布: 2025-02-02 06:11:14
原创
141 人浏览过

What's the Fastest Way to Insert 4000  Records into a Database Using Entity Framework within a TransactionScope?

Entity Framework 高效批量插入数据方法

问题:

在使用 TransactionScope 进行事务处理时,如何快速地将 4000 多条记录批量插入到数据库中?

答案:

对于大量数据插入 (4000 条记录),逐条调用 SaveChanges() 方法效率极低。以下优化技术可以显着提高插入速度:

  • 一次性 SaveChanges() 在所有记录都添加到上下文后,一次性调用 SaveChanges()
  • 分批 SaveChanges() 处理指定数量的记录后 (例如,100 条),调用一次 SaveChanges()
  • SaveChanges() 后重建上下文: 类似于分批方法,但在 SaveChanges() 后释放上下文并创建一个新的上下文,以释放已附加的实体。
  • 禁用更改检测: 临时禁用自动更改检测,将 Configuration.AutoDetectChangesEnabled 设置为 false

实现示例:

以下代码片段结合了上述优化技术:

<code class="language-csharp">using (TransactionScope scope = new TransactionScope())
{
    MyDbContext context = null;
    try
    {
        context = new MyDbContext();
        context.Configuration.AutoDetectChangesEnabled = false;

        int count = 0;
        foreach (var entityToInsert in someCollectionOfEntitiesToInsert)
        {
            ++count;
            context = AddToContext(context, entityToInsert, count, 100, true);
        }

        context.SaveChanges();
    }
    finally
    {
        if (context != null)
            context.Dispose();
    }

    scope.Complete();
}

private MyDbContext AddToContext(MyDbContext context,
    Entity entity, int count, int commitCount, bool recreateContext)
{
    context.Set<Entity>().Add(entity);

    if (count % commitCount == 0)
    {
        context.SaveChanges();
        if (recreateContext)
        {
            context.Dispose();
            context = new MyDbContext();
            context.Configuration.AutoDetectChangesEnabled = false;
        }
    }

    return context;
}</code>
登录后复制

此模式通过在调用 SaveChanges() 之前处理多条记录来实现批量插入。此外,在 SaveChanges() 后释放并重新创建上下文有助于清除已附加的实体,从而减少内存使用并提高性能。

性能对比:

使用此优化模式将 560,000 个实体插入数据库的性能测试结果:

  • commitCount = 10000, recreateContext = false: 202 秒
  • commitCount = 100, recreateContext = true: 164 秒

相比之下,如果对每条记录都调用 SaveChanges(),则完成相同操作将需要数小时。

以上是在TransactionsCope中使用实体框架将4000记录插入数据库中的最快方法是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板