首页 > C# > 在实体框架中插入的最快方法?

在实体框架中插入的最快方法?

上一篇 下一篇

我正在寻找插入实体框架的最快方法。

我问这个是因为您有一个活动并且插入很大(4000+)的情况。它可能会持续超过 10 分钟(事务的默认超时),这将导致事务不完整。TransactionScope

分割线

网友回答:

这种组合可以很好地提高速度。

context.Configuration.AutoDetectChangesEnabled = false;
context.Configuration.ValidateOnSaveEnabled = false;

分割线

网友回答:

您应该考虑为此使用 。这是文档,当然网上也有很多教程。System.Data.SqlClient.SqlBulkCopy

抱歉,我知道您正在寻找一个简单的答案来让 EF 执行您想要的操作,但批量操作并不是 ORM 的真正用途。

分割线

网友回答:

对于您在问题评论中的评论:

“…保存更改(对于每
条记录
)…”

这是你能做的最糟糕的事情!调用每条记录会大大降低批量插入的速度。我会做一些简单的测试,这些测试很可能会提高性能:SaveChanges()

  • 在所有记录后呼叫一次。SaveChanges()
  • 例如 100 条记录后调用。SaveChanges()
  • 例如,调用 100 条记录并释放上下文并创建一个新记录。SaveChanges()
  • 禁用更改检测

对于批量插入,我正在研究并尝试这样的模式:

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;
}

我有一个测试程序,它将 560.000 个实体(9 个标量属性,无导航属性)插入数据库。使用此代码,它可以在不到 3 分钟的时间内工作。

对于性能,重要的是调用“许多”记录(“许多”大约 100 或 1000)。它还提高了在保存更改后释放上下文并创建新上下文的性能。这会从所有 entites 中清除上下文,不这样做,实体仍然附加到状态中的上下文。上下文中附加实体的大小不断增大,会逐步减慢插入速度。因此,一段时间后清除它是有帮助的。SaveChanges()SaveChangesUnchanged

以下是我的 560000 个实体的一些度量:

  • commitCount = 1,recreateContext = false:许多小时(这是您当前的程序)
  • commitCount = 100,recreateContext = false:超过 20 分钟
  • 提交计数 = 1000,重新创建上下文 = 假:242 秒
  • 提交计数 = 10000,重新创建上下文 = 假:202 秒
  • 提交计数 = 100000,重新创建上下文 = 假:199 秒
  • commitCount = 1000000,recreateContext = false:内存不足异常
  • commitCount = 1, recreateContext = true: 超过 10 分钟
  • commitCount = 10, recreateContext = true: 241 秒
  • commitCount = 100, recreateContext = true: 164 秒
  • commitCount = 1000, recreateContext = true: 191 秒

上面第一个测试中的行为是性能是非常非线性的,并且随着时间的推移而急剧下降。(“许多小时”是一个估计,我从未完成这个测试,我在 50.000 分钟后停止在 20 个实体。这种非线性行为在所有其他测试中并不那么重要。

模板简介:该模板名称为【在实体框架中插入的最快方法?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 237次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 03-10
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信图片 微信模板 微信公众平台 自适应 html5 微信文章 企业网站 单页式简历模板 响应式 微信素材
您可能会喜欢的其他模板