配置的执行策略“SqlAzureExecutionStrategy”不支持用户启动的事务

时间:2015-05-24 08:55:07

标签: entity-framework azure azure-sql-database sqltransaction

我正在使用最新的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;

这允许我现在运行应用程序,但我仍然(很少我可能会添加)获得瞬态错误消息?

  

从接收结果时发生传输级别错误   服务器

2 个答案:

答案 0 :(得分:2)

除了暂停执行策略之外,您还需要包含您正在重试的操作,包括手动调用执行策略中的事务,请参阅我对How to use SqlAzureExecutionStrategy and "Nolock"的回答

答案 1 :(得分:2)

确保将整个事物包装在try / finally中,以确保将suspend标志设置为false。另请查看此链接以获取详细说明:msdn.microsoft.com/en-us/data/dn307226