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

lee*_*n3o 14 entity-framework azure sqltransaction azure-sql-database

我正在使用最新的v6实体框架以及UnitOfWork模式.在过去的几年里,这在服务器上一直很好.

我想转移到azure托管并使用SQLAzure,因此开始迁移应用程序.但是我遇到了很多问题.

首先,我一直在间歇地得到这个错误

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

经过一些谷歌搜索,似乎这很常见,你需要实现自己的SqlAzureExecutionStrategy- 一切似乎都很好.直到我发现它不支持发起的交易!

然后我偶然发现了这篇博文 - 其中概述了确切的问题并提供了如何解决问题的示例代码(或者我认为).

我完全按照这个帖子(据我所知).我有我的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); }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个上面引用的自定义类,名为'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;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行我的应用程序时,我仍然得到与我开始时相同的错误,但这次只是指向自定义类?

配置的执行策略'CustomSqlAzureExecutionStrategy'不支持用户启动的事务.

我错过了一些明显的东西吗?还是不明白的东西?任何帮助将不胜感激.

更新


通常...... StackOverFlow橡皮鸭.我实际上读了它,发现我需要手动设置SuspendExecutionStrategy我的UnitOfWork(在BeginTransaction之前和Commit之后).

所以我刚才有这个 .BeginTransaction()

EfConfig.SuspendExecutionStrategy = true;
Run Code Online (Sandbox Code Playgroud)

就在此之后 .Commit()

EfConfig.SuspendExecutionStrategy = false;
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*ryd 4

除了暂停执行策略之外,您还需要包装您正在重试的操作,包括手动调用执行策略中的事务,请参阅我对如何使用 SqlAzureExecutionStrategy 和“Nolock”的回答