3

私は EF 5 を使用しており、何らかの方法で接続作成パイプラインにハックする必要があります。これが私の状況です。実稼働環境では、web.config で指定した 2 つの SQL サーバー (これを制御することはできません) があります。1 つの接続が失敗した場合は、別の接続を試す必要があります。繰り返しになりますが、SQL フェールオーバー クラスタリングについては知っていますが、前述のとおり、それを制御することはできません。

DbContextを取るオーバーロードを使ってみましたDbConnection。次に、自分で接続を開いて成功したかどうかを確認してから、EFに渡しました。問題は、EF が閉じた接続のみを必要とすることでした。そして、接続を開いて閉じてから、EF に再度接続させるのは本当にばかげているようです!

もっと良い方法はありますか??

4

1 に答える 1

1

両方の接続が Web.config ファイルで指定されている場合は、DbContext クラスのこのオーバーロードを使用する必要があります。<connectionStrings>接続しようとしているレコードにある名前を渡すだけで、Web.config ファイルに入り、その接続文字列を取得して、接続を開きます。

例 (プレーンな localhost を SQLEXPRESS で使用 - プロセスに簡単に変換可能)

 <connectionStrings>
    <add name="Connection1" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog = FirstDB;Integrated Security=True" providerName="System.Data.SqlClient;MultipleActiveResultSets=true;" />
    <add name="Connection2" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog = SecondDB;Integrated Security=True" providerName="System.Data.SqlClient;MultipleActiveResultSets=true;" />
 </connectionStrings>

次に、DbContext クラスに次のコンストラクターを用意します。

public MyDbContext(string connectionString) : base(connectionString)
{

}

「 Connection1 connectionString」または「Connection2」のいずれかになります。

編集: コメントによると、単に切り替えを行う DbContext の上にレイヤーを作成する必要があると思います。その際、次の手順を検討することをお勧めします。

1) DbContext オブジェクトを持つクラス (ContextLayer と呼びましょう) を作成します。このクラスが静的かどうかはあなた次第です。また、IDisposable を実装することもできます。

2) そのプロジェクトの Web.Config ファイルに、接続する可能性のあるすべてのデータベースの接続文字列エントリがあることを確認してください。

3) 構成ファイルで見つかった最初の接続文字列を使用して、DbContext オブジェクトを提供するレイヤー クラスにメソッドを用意します。別の方法として、DbContext オブジェクトをプライベート フィールドとして持つリポジトリ自体にレイヤーを作成し、特定の情報を取得するためのリポジトリ メソッドを公開することもできます。

4) このレイヤ クラスには、DbContext.SaveChanges() と同様に、int を返す SaveChanges() メソッドがあります。SaveChanges() 内で、接続が良好かどうかを確認します。それ以外の場合は、Web.Config ファイル内の他の接続文字列エントリをそれぞれ調べて、DbContext クラスの新しいインスタンス (現在のクラスとは異なるオブジェクト) を使用してテストします。それらのいずれかが機能する場合は、他の DbContext クラスに変更を適用するためのすべてのロジックを実行します。これを静的クラスにすることにした場合は、必要に応じて、クラスの DbContext オブジェクトをこのコンテキストに設定することができます。

5) どのコンテキストも機能しない場合は、メソッドに -1 を返させ、保存先のデータベースが見つからなかったため、保存できなかったというポップアップが画面に表示されることがあります。

このコーディングを 1 回行うことで、データベースに保存しようとするたびに、レイヤー クラスを非常に単純に 1 回呼び出すだけで済みます。 、接続できなかったことをクライアントに示すためのクリーンな方法。

于 2013-01-07T20:37:53.503 に答える