2

WCF サービスを Azure に移行するために、Repository クラスに Connection Resiliency を追加してテストしようとしています。Julie Lerman のすばらしい投稿があります。

http://thedatafarm.com/data-access/testing-out-the-connection-resiliency-feature-into-ef6/#comment-61311

通常の Entity Framework クエリを使用するリポジトリ メソッドを呼び出すと、Interceptor ReaderExecuting メソッドがトリガーされ、接続の問題をシミュレートできます。

var states = dbContext.Blogs.ToList();

しかし、何らかの理由で、ストアド プロシージャから返された「複数の結果セット」を使用するリポジトリ メソッドの 1 つが実行されているときに、Interceptor ReaderExecuting メソッドが呼び出されません (以下のコードを参照)。「ObjectContext.Translate」または「ToList」が実行されたときに ReaderExecuting メソッドが呼び出されることを期待していますが、そうではありません。

db.Database.Connection.Open();

var reader = cmd.ExecuteReader();

var blogs = ((IObjectContextAdapter)db).ObjectContext.Translate<Blog>(reader).ToList();

参考までに、「複数の結果セット」の処理については、この記事に従っています。

https://msdn.microsoft.com/en-us/data/jj691402.aspx

接続の回復力を処理するために、Entity Framework 6+ 実行戦略を中継しようとしています。しかし、複数の結果セットを処理できない場合、私の次のオプションは、一時的な例外処理に Polly ライブラリを使用することです。

このような状況に遭遇したことがありますか?

それに対する解決策はありますか?

4

3 に答える 3

0

DbConfigurationそのようなカスタム実装から組み込みの接続の回復力を配線しようとしましたか?

public class MyDbConfiguration : DbConfiguration
{
    public MyDbConfiguration()
        : base()
    {
        var strategy = System.Data.Entity.SqlServer.SqlAzureExecutionStrategy();
        SetExecutionStrategy("System.Data.EntityClient", strategy);
        SetExecutionStrategy("System.Data.SqlClient", strategy);
    }
}

私は MARS でこのアプローチを使用しましたが、問題はありませんでした。

于 2015-08-10T21:55:28.917 に答える
0

このシナリオでは、ExecuteReader の呼び出しは EF の範囲外です。コードは ADO.NET コマンド オブジェクトで直接呼び出しています。コマンドの実行のためにEFを完全に回避しているため、すべてのEF(インターセプターを含む)を見逃しています。Translate は、既に取得した結果を単純に取得し、それらをオブジェクトに入力します。

于 2015-08-12T18:04:36.550 に答える
0

@tdykstra が言及した EF の制限のため、「複数の結果セット」ではなく XML 出力を返すようにストアド プロシージャを変更しました。「SqlQuery」メソッドを使用してストアド プロシージャを呼び出し、出力 XML を取得してから、XML をオブジェクトに逆シリアル化しました。このようにして、Interceptor ReaderExecuting メソッドが実行され、接続の回復力をテストできました。将来のリリースで、EF チームが「複数の結果セット」のサポートをさらに追加することを願っています。サンプルコードは次のとおりです。

var paramId = new SqlParameter
{
    ParameterName = "id",
    SqlDbType = SqlDbType.Xml,
    Direction = ParameterDirection.Input,
    Value = 1
};

var paramXmlResult = new SqlParameter
{
    ParameterName = "XmlResult",
    SqlDbType = SqlDbType.Xml,
    Direction = ParameterDirection.Output
};

db.Database.SqlQuery<XElement>(
    "EXEC [dbo].[GetDataAsXml] @id, @XmlResult OUT", 
    paramId, paramXmlResult).ToList();


XElement xmlResult = XElement.Parse(paramXmlResult.Value.ToString());

//FromXElement is an Extension method that deserializes XML into a Type (like MyData)
MyData data = xmlResult.FromXElement<MyData>();
于 2015-08-14T03:14:47.450 に答える