实体框架性能不一致

时间:2015-07-13 13:47:44

标签: c# entity-framework entity-framework-6

我的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倍。

导致这种表现不一致的原因是什么?

1 个答案:

答案 0 :(得分:0)

Rick Stahl在http://weblog.west-wind.com/posts/2013/Dec/22/Entity-Framework-and-slow-bulk-INSERTs讨论了这样的问题,他认为这个问题是ef中的变更跟踪机制,并提出了解决这些问题的一些解决方案