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 ラバー ダッキング。私は実際にそれを正しく読んで、手動でSuspendExecutionStrategy
UnitOfWork に設定する必要があることを発見しました (Before BeginTransaction および Commit の後)。
だから私はこれを直前に持っています.BeginTransaction()
EfConfig.SuspendExecutionStrategy = true;
そしてこの直後.Commit()
EfConfig.SuspendExecutionStrategy = false;
これでアプリケーションを実行できるようになりましたが、まだ (まれに付け加えるかもしれませんが) 一時的なエラー メッセージが表示されますか?
サーバーから結果を受信中にトランスポート レベルのエラーが発生しました。