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

时间:2016-01-14 18:31:39

标签: c# entity-framework stored-procedures bulkinsert

我使用Entity Framework来调用存储过程。我有一个场景,这个程序,所有说和完成,被称为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);
   }
}

3 个答案:

答案 0 :(得分:0)

正如我在评论中所说,我重新考虑你的架构。

  1. 考虑利用数据库的强大功能。将数据插入临时表,然后再处理。例如,为父子关系使用临时GUID。
  2. 使用一些批量复制机制,例如NuGet提供的EntityFramework.BulkInsert,甚至是.Net框架的标准SqlBulkCopy类型。

答案 1 :(得分:0)

当您插入数据时......数据必须以某种方式进入...... 我会尝试将这些设置为false ..插入之前..然后看看你得到了什么。

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

答案 2 :(得分:0)

我使用用户定义的表结束,允许我传入多行来进行批量插入。把我的时间缩短一半。我很满意。 :)

基本上遵循这个:

http://www.c-sharpcorner.com/blogs/bulk-insert-into-table-using-userdefined-table-type1