C# 使用实体框架进行大型插入/更新的存储过程

C# 使用实体框架进行大型插入/更新的存储过程,c#,entity-framework,stored-procedures,bulkinsert,C#,Entity Framework,Stored Procedures,Bulkinsert,我使用实体框架来调用存储过程。我有一个场景,在这个场景中,这一个过程(所有说的和做的)被调用3000次,然后对于这3000个存储过程调用中的每一个,另一个存储过程将被调用1到100次。总共大约需要20分钟。我想把时间缩短一半。我能做些什么来优化它吗 基本上就是这样发生的: foreach (var parentObject in parents) //parents.count = 3000 { int id = _efContext.prInsertParent(parentObject

我使用实体框架来调用存储过程。我有一个场景,在这个场景中,这一个过程(所有说的和做的)被调用3000次,然后对于这3000个存储过程调用中的每一个,另一个存储过程将被调用1到100次。总共大约需要20分钟。我想把时间缩短一半。我能做些什么来优化它吗

基本上就是这样发生的:

foreach (var parentObject in parents) //parents.count = 3000
{
   int id = _efContext.prInsertParent(parentObject.Name, parentObject.values, etc..);

   // Have to get SCOPE_IDENTITY() id to be able to add children
   foreach (var child in parentObject.Children) //children count up to 100 items
   {
       _efContext.prInsertChild(id, etc..othervalues);
   }
}

正如我在评论中所说,我会重新思考您的架构

  • 考虑利用数据库的功能。将数据插入临时表,然后再进行处理。例如,为父子关系使用临时GUID
  • 使用一些大容量复制机制,例如NuGet提供的EntityFramework.BulkInsert,甚至是作为.Net framework一部分的标准SqlBulkCopy类型

  • 插入数据时。。。数据必须以某种方式获取。。 我会尝试将这些设置为false。。插入之前。。看看你能得到什么

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

    最后,我使用了一个用户定义的表,允许我传入多行以进行批量插入。把我的时间减半。我很满意

    基本上是这样的,


    就个人而言,我会重新思考架构。3000个存储过程调用是不可接受的,当额外的100个调用以指数形式影响时,情况就更糟了。那么,最坏的情况是300000个调用?这些配置是否只适用于实际实体(POCO)?我只是打电话给你你说得对。。我想知道在插页上花费的时间最多的地方。假设您必须通过网络来驱动它?这是短暂的时间吗。。您可以尝试将所有数据猛击到某种字节数组中,然后将其压缩并作为parm发送。。然后让另一侧的SP将其拆开,并在那里执行所有插入操作。。(假设你的DB sp可以处理这些事情。)我不确定你是否想在你的应用程序中维护结构和ID的post insert