任何更新后,DbContext Dispose都非常慢

时间:2015-10-16 18:52:59

标签: c# entity-framework-6 dispose dbcontext savechanges

我已经更新了我的代码,以便在使用后通过DbContext声明(根据在线社区中的几乎所有人)正确处理我的所有EF6 using对象。所以现在我可以确切地知道调用dispose需要多长时间。

我发现DBContext以毫秒为单位消失,除非<{em}} DbContext修改了内容,并且SaveChanges命令对它执行。当发生这种情况时(在任何内容上),处理大约需要13秒。

显然,我无法看到Dispose命令在幕后实际做了什么,但它的速度非常慢,我不知道如何继续。建议?

2 个答案:

答案 0 :(得分:0)

事实证明,问题实际上是由于我的额外DBConfiguration的transactionHandler“CommitFailureHandler”。当我关闭故障处理程序时,一切都恢复到全速!事实证明,__TransactionHistory表已经变得非常大。

我创建了一个SQL脚本,根据需要手动删除旧记录......

delete from [__TransactionHistory] where CreationTime <  DATEADD(day, -2, getdate())

我确信有一种自动方式可以做到这一点,但对于我们的应用程序,它可以简单地手动完成,偶尔也可以。

答案 1 :(得分:0)

我们在Azure SQL数据库中遇到了同样的问题。我们根据msdn Documentation over Handling of Transaction Commit Failures

配置您的EntityFramework

在我们检测到此问题后,我们删除了这行代码,再次关闭此功能:

public class MyConfiguration : DbConfiguration  
{ 
  public MyConfiguration()  
  {  
    // SetTransactionHandler(SqlProviderServices.ProviderInvariantName, () => new CommitFailureHandler());  
    SetExecutionStrategy(SqlProviderServices.ProviderInvariantName, () => new SqlAzureExecutionStrategy());  
  }  
}

基于codeplex Documentation Handling of Transaction Commit Failures,您可以在应用程序启动时添加此代码以清理__TransactionHistory表。

var commitFailureHandler = CommitFailureHandler.FromContext(context);
if (commitFailureHandler != null)
{
    commitFailureHandler.ClearTransactionHistory();
}