EF 4.1寻求有关如何加快行添加的想法

时间:2012-03-07 00:09:22

标签: entity-framework-4

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

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.Load将其解码为XElement。它被解码为包含最多50个项目的项目列表 - 这是我在每个循环传递中从服务器请求的内容。由于SaveChanges调用,该块会立即保存到表中。

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

如何在保持EF的同时提高将数据存储到数据库的效率?

我知道我可以从XML批量加载数据库,但这会迫使我弄清楚我需要编写的SQL语句,因为几个相关的表通过上面的SaveChanges调用得到更新,所以我开始失败使用EF的优点。

1 个答案:

答案 0 :(得分:2)

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

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

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