Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架性能不一致_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 实体框架性能不一致

C# 实体框架性能不一致,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我的MVC应用程序中有一种方法,即使用实体框架插入调查结果。这项调查有大约70个问题,所有的结果都被插入到一个SaveChanges的调用中 // mock code public class SurveyService { public SurveyService(MyDbContext db) { ... } public void SaveSurvey(...) { foreach(var result in results) {

我的MVC应用程序中有一种方法,即使用实体框架插入调查结果。这项调查有大约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。只需添加一组实体并进行一次保存更改。代码不是非常慢,但是每次插入大约需要20毫秒。当您有70个实体时,加起来就是1.4秒

我可以在LinqPad中使用这个非常相同的类(使用程序集创建连接),并执行以下操作:

// in linqpad this refers to the context
var survey = new SurveyService(this);

survey.SaveSurvey(...);
使用相同的web.config,指向相同的数据库并保存相同的结果,每次保存大约需要2-3毫秒。我已经检查了Change Tracker,上下文中的内容与它使用的代码完全相同,因此我不确定开销在哪里。我添加了数据库日志记录,可以一致地看到,在应用程序中运行时,查询速度大约慢10倍


是什么导致了性能的这种不一致性?

Rick Stahl在会上讨论了类似的问题,他认为问题在于ef中的更改跟踪机制,并提出了一些解决方案来解决这些问题

您是否尝试使用调试器来测量性能?或者怎么做?我不认为EF有什么问题,一定是您的SqlServer可能面临高流量。如果您直接将相同的数据插入SqlServer(只需在SSMS中运行insert查询),会发生什么情况?有需要重建的索引吗?触发器?@MatíasFidemraizer我在SaveChanges()之前/之后使用秒表测量总时间。我查看setting Database.Log输出的单个查询次数。@AkashKava,这并不能解释为什么在站点上执行与在LinqPad中执行不同。它使用的是同一个数据库。我不是说性能很关键,我只是想理解为什么它不同。如果有什么东西没有在LinqPad中运行,但是在站点上却增加了开销。这并不能解释为什么它在正常运行时比在LinqPad中运行时慢。使用实体框架和相同数据库的代码是相同的,但LinqPad的速度要快10倍。更改跟踪在这两个实例中都运行。