我已经更新了我的代码,以便在使用后通过DbContext
声明(根据在线社区中的几乎所有人)正确处理我的所有EF6 using
对象。所以现在我可以确切地知道调用dispose
需要多长时间。
我发现DBContext
以毫秒为单位消失,除非<{em}} DbContext
修改了内容,并且SaveChanges
命令对它执行。当发生这种情况时(在任何内容上),处理大约需要13秒。
显然,我无法看到Dispose命令在幕后实际做了什么,但它的速度非常慢,我不知道如何继续。建议?
答案 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();
}