Entity framework 4 EF 4.1寻求如何加快行添加的想法

Entity framework 4 EF 4.1寻求如何加快行添加的想法,entity-framework-4,Entity Framework 4,我使用以下循环从联机数据填充数据库,如(简化,无错误检查): 代码需要一些时间从服务器获取XML响应,并使用XElement.Load on response stream将其解码为XElement。它被解码成一个项目列表,其中最多包含50个项目——这是我在每个循环过程中向服务器请求的。由于SaveChanges调用,该块会立即保存到表中 循环时间的8/10用于将项添加到DbContext或SaveChanges调用中,或用于两者。与远程服务器的通信和将响应XML解码为实体列表是2/10 如何提

我使用以下循环从联机数据填充数据库,如(简化,无错误检查):

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

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

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


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

简言之:您无法使用纯EF加快插入过程,因为EF有。你有两个问题:

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

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

。起初,我认为从流构造XElement,然后从XElement子级创建POCO对象列表将是一个瓶颈!
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);
   }
}