我的MVC应用程序中有一个方法,即使用Entity Framework插入调查结果。该调查有大约70个问题,所有结果都插入到SaveChanges的一次调用中。
// mock code
public class SurveyService {
public SurveyService(MyDbContext db) { ... }
public void SaveSurvey(...) {
foreach(var result in results) {
db.Results.Add(new Result(...));
}
db.SaveChanges();
}
}
我不是在循环中调用SaveChanges。只需添加一堆实体并执行一次SaveChanges。代码并不是非常慢,但每个INSERT大约需要20 ms。如果您有70个实体,最多可累加1.4秒。
我可以在LinqPad中使用同一个类(使用程序集创建连接)并执行以下操作:
// in linqpad this refers to the context
var survey = new SurveyService(this);
survey.SaveSurvey(...);
使用完全相同的web.config,指向同一个数据库并保存相同的结果,每次保存大约需要2-3毫秒。我检查了更改跟踪器,上下文中的内容与使用完全相同的代码之间没有任何差异,因此我不确定开销在哪里。我添加了数据库日志记录,并且可以非常一致地看到在应用程序中运行时查询速度大约慢了10倍。
导致这种表现不一致的原因是什么?
答案 0 :(得分:0)
Rick Stahl在http://weblog.west-wind.com/posts/2013/Dec/22/Entity-Framework-and-slow-bulk-INSERTs讨论了这样的问题,他认为这个问题是ef中的变更跟踪机制,并提出了解决这些问题的一些解决方案