C# 使用实体框架进行大型插入/更新的存储过程
我使用实体框架来调用存储过程。我有一个场景,在这个场景中,这一个过程(所有说的和做的)被调用3000次,然后对于这3000个存储过程调用中的每一个,另一个存储过程将被调用1到100次。总共大约需要20分钟。我想把时间缩短一半。我能做些什么来优化它吗 基本上就是这样发生的: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
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);
}
}
正如我在评论中所说,我会重新思考您的架构
插入数据时。。。数据必须以某种方式获取。。 我会尝试将这些设置为false。。插入之前。。看看你能得到什么
Configuration.AutoDetectChangesEnabled = false;
Configuration.ValidateOnSaveEnabled = false;
最后,我使用了一个用户定义的表,允许我传入多行以进行批量插入。把我的时间减半。我很满意 基本上是这样的,
就个人而言,我会重新思考架构。3000个存储过程调用是不可接受的,当额外的100个调用以指数形式影响时,情况就更糟了。那么,最坏的情况是300000个调用?这些配置是否只适用于实际实体(POCO)?我只是打电话给你你说得对。。我想知道在插页上花费的时间最多的地方。假设您必须通过网络来驱动它?这是短暂的时间吗。。您可以尝试将所有数据猛击到某种字节数组中,然后将其压缩并作为parm发送。。然后让另一侧的SP将其拆开,并在那里执行所有插入操作。。(假设你的DB sp可以处理这些事情。)我不确定你是否想在你的应用程序中维护结构和ID的post insert