我正在使用最新的v6实体框架以及UnitOfWork模式。在过去的几年里,这在服务器上一直很好。
我想转移到azure托管并使用SQLAzure,因此开始迁移应用程序。但是我遇到了很多问题。
首先,我一直在间歇地得到这个错误
从接收结果时发生传输级别错误 服务器
经过一些谷歌搜索,似乎这很常见,你需要实现自己的SqlAzureExecutionStrategy
- 一切似乎都很好。直到我发现它不支持发起的交易!
I then stumbled on this blog post - 其中概述了确切的问题并提供了如何解决问题的示例代码(或者我认为)。
我完全按照帖子(据我所知)。我有我的dBconfiguration类设置,它在应用程序启动时就达到了SetExecutionStrategy。
public class EfConfig : DbConfiguration
{
public EfConfig()
{
SetExecutionStrategy("System.Data.SqlClient", () => SuspendExecutionStrategy
? (IDbExecutionStrategy)new DefaultExecutionStrategy()
: new CustomSqlAzureExecutionStrategy());
}
public static bool SuspendExecutionStrategy
{
get { return (bool?)CallContext.LogicalGetData("SuspendExecutionStrategy") ?? false; }
set { CallContext.LogicalSetData("SuspendExecutionStrategy", value); }
}
}
然后我有一个上面引用的自定义类,名为'CustomSqlAzureExecutionStrategy',我在下面提到了它并覆盖了ShouldRetryOn方法
public class CustomSqlAzureExecutionStrategy : SqlAzureExecutionStrategy
{
protected override bool ShouldRetryOn(Exception exception)
{
var shouldRetry = false;
var sqlException = exception as SqlException;
if (sqlException != null)
{
foreach (SqlError error in sqlException.Errors)
{
if (error.Number == -2)
{
shouldRetry = true;
}
}
}
shouldRetry = shouldRetry || base.ShouldRetryOn(exception);
return shouldRetry;
}
}
但是,当我运行我的应用程序时,我仍然会遇到与我开始时相同的错误,但这次只是指向自定义类?
配置的执行策略'CustomSqlAzureExecutionStrategy' 不支持用户发起的交易。
我错过了一些明显的东西吗?还是不明白的东西?任何帮助将不胜感激。
通常...... StackOverFlow橡皮鸭。我实际上已经正确地阅读了它,发现我需要在我的UnitOfWork中手动设置SuspendExecutionStrategy
(在BeginTransaction之前和在Commit之后)。
所以我在.BeginTransaction()
EfConfig.SuspendExecutionStrategy = true;
就在.Commit()
EfConfig.SuspendExecutionStrategy = false;
这允许我现在运行应用程序,但我仍然(很少我可能会添加)获得瞬态错误消息?
从接收结果时发生传输级别错误 服务器
答案 0 :(得分:2)
除了暂停执行策略之外,您还需要包含您正在重试的操作,包括手动调用执行策略中的事务,请参阅我对How to use SqlAzureExecutionStrategy and "Nolock"的回答
答案 1 :(得分:2)
确保将整个事物包装在try / finally中,以确保将suspend标志设置为false。另请查看此链接以获取详细说明:msdn.microsoft.com/en-us/data/dn307226