将 Entity Framework 用于大 inserts/updates 的存储过程

Stored Procedures Using Entity Framework for large inserts/updates

我正在使用 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);
   }
}

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

  1. 考虑利用数据库的力量。将数据插入暂存 table,然后再处理它。例如,为 parent-child 关系使用临时 GUID。
  2. 使用一些批量复制机制,例如 NuGet 提供的 EntityFramework.BulkInsert,甚至是 .Net 框架中的标准 SqlBulkCopy 类型。

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

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

我最后使用 user-defined table 允许我传入多行以进行批量插入。把我的时间减半。我很满意。 :)

基本上是这样的:

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