15

UnitOfWork パターンと共に Entity Framework の最新の v6 を使用しています。これは、過去数年間、サーバー上で問題ありませんでした。

Azure Hosting に移行して 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); }
    }
}

次に、上記で参照した「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 ラバー ダッキング。私は実際にそれを正しく読んで、手動でSuspendExecutionStrategyUnitOfWork に設定する必要があることを発見しました (Before BeginTransaction および Commit の後)。

だから私はこれを直前に持っています.BeginTransaction()

EfConfig.SuspendExecutionStrategy = true;

そしてこの直後.Commit()

EfConfig.SuspendExecutionStrategy = false;

これでアプリケーションを実行できるようになりましたが、まだ (まれに付け加えるかもしれませんが) 一時的なエラー メッセージが表示されますか?

サーバーから結果を受信中にトランスポート レベルのエラーが発生しました。

4

2 に答える 2

3

実行戦略を一時停止することに加えて、実行戦略への手動呼び出しでトランザクションを含め、再試行しているアクションをラップする必要もあります。SqlAzureExecutionStrategy と "Nolock" の使用方法に対する私の回答を参照してください。

于 2015-08-19T17:58:51.207 に答える
2

すべてを try/finally でラップして、サスペンド フラグを false に戻してください。詳細な説明については、このリンクもご覧ください。 ヘルプリンク

于 2015-11-25T06:08:04.357 に答える