任何更新后 DbContext Dispose 都非常慢

DbContext Dispose is extremely slow after any Update

我已经更新了我的代码,以便在使用后通过 using 语句正确处理我所有的 EF6 DbContext 对象(根据在线社区中的几乎每个人的说法)。所以现在我可以准确地看到调用 dispose.

需要多长时间

我发现 DBContext 会在几毫秒内消失,除非 DbContext 修改了一段内容,并且[= =15=] 对其执行的命令。当这种情况发生时(在任何内容上),处理大约需要 13 秒。

显然,我看不到 Dispose 命令在幕后实际做了什么,但它慢得离谱,我不确定如何继续。建议?

原来问题其实出在我额外的DBConfiguration的transactionHandler"CommitFailureHandler"。当我关闭故障处理程序时,一切都会恢复全速!原来__TransactionHistory table已经长到很大了

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

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

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

我们在 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 table。

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