【问题标题】:EF 4.1 Seeking ideas on how to speed up adding of rowsEF 4.1 寻求有关如何加快添加行的想法
【发布时间】:2012-03-07 17:28:28
【问题描述】:

我正在使用循环从在线数据填充我的数据库(简化,没有错误检查):

foreach (var catalog in catalogs)
{
   var result = Items(catalog, state, context);
   while (result != null)
   {
      result.ForEach(r => context.DbContext.Items.Add(r));
      context.DbContext.SaveChanges();
      result = Items(catalog, state, context);
   }
}                  

代码需要一些时间从服务器获取 XML 响应并将其解码为 XElement,在响应流上使用 XElement.Load。它被解码成一个包含最多 50 个项目的项目列表 - 这是我在每个循环传递中从服务器请求的内容。由于 SaveChanges 调用,该块立即保存到表中..

8/10 的循环时间用于将项目添加到 DbContext 或 SaveChanges 调用或两者上。与远程服务器通信并将响应 XML 解码为实体列表是 2/10。

如何提高将数据存储到数据库中的效率,同时仍然使用 EF?

我知道我可以从 XML 批量加载数据库,但这将迫使我找出我需要编写的 SQL 语句,因为几个相关的表会通过上面的 SaveChanges 调用进行更新,所以我开始丢失使用 EF 的优势。

【问题讨论】:

    标签: entity-framework-4


    【解决方案1】:

    简而言之:您无法使用纯 EF 加快插入过程,因为 EF 有 very poor performance for bulk / batch data processing。你有两个问题:

    • 将实体添加到上下文需要一些成本,并且随着上下文中已经存在的每个实体,此成本会增加。为避免这种情况,您可以尝试在每次调用 Add 后调用 SavaChanges,甚至尝试为每批甚至每次调用 Add 使用新上下文。
    • EF 为您要插入、更新或删除的每条记录创建一个单独的数据库往返,因此通常与您多久拨打一次SaveChanges 无关。只有在使用直接 SQL 并创建单个 SqlCommand 一次执行所有插入时才能避免这种情况。

    如果您想提高性能,请使用直接 SQL。

    【讨论】:

    • 叹息。最初我预计从流中构造 XElement,然后从其 XElement 子级创建 POCO 对象列表将成为瓶颈!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多