1

DbContext を使用して EntityFramework バックボーンを持つ C# アプリケーションを扱っています。アプリケーションには 2 つの選択肢があります。ネットワーク接続が利用できない場合は、リモートの SQL Server Express に接続するか、ローカルの SQL Compact 4.0 データベースに接続します。アプリケーションの起動時に、リモート データベースへの接続が可能かどうかをスレッドがチェックしています。それ以外の場合は、ローカル データベースに接続するために、接続文字列とプロバイダーを自動的に切り替える必要があります。これまでのところ、app.config の接続文字列セクションを変更し、構成を保存した後、アプリケーションにセクションを強制的に更新させることで、この問題に対処しようとしていました。app.config ファイルに書き込むためのアクセス権が必要なため、このアプローチは最適ではありません。より良いアプローチを提案できますか?

4

2 に答える 2

2

次のように、接続文字列の管理をクラスにラップし、そのクラスをシングルトンにして、それを使用してアクティブな接続文字列を取得します。

public delegate void ConnectionChangedEventHandler(object sender, EventArgs e);

class ConnStringManager {
    static public ConnStringManager Instance {get;private set;}
    static {
        Instance = new ConnStringManager();
    }
    public event ConnectionChangedEventHandler Changed;
    private readonly string localConn;
    private readonly string remoteConn;
    public string ConnectionString {get; private set;}
    private ConnStringManager() {
        localConn = ... // Get local connection string from the config
        remoteConn = ... // Get remote connection string from the config
        TestAndSetConnectionString();
    }
    public void TestAndSetConnectionString() {
        bool canUseRemote = true;
        if (...) {
             // Do some testing to see if remote DB is accessible
        }
        // Switch the connection string
        var nextString = canUseRemote ? remoteConn : localConn;
        bool changed = nextString != ConnectionString;
        ConnectionString = nextString;
        if (changed && Changed != null) {
             Changed(this, EventArgs.Empty);
        }
    }
}
于 2012-09-21T13:21:35.907 に答える
0

DbContextコンストラクターは、接続文字列の名前、または選択する実際の接続文字列のいずれかを受け入れます。

あなたができることは、最初の接続文字列をテストすることです-おそらく簡単な接続または簡単なものを使用して、接続する場合はそれを使用し、そうでない場合は他の接続文字列を使用して接続します.

擬似コード:

        YourDbContext YourContext;
        if (TestConnection())
        {
            YourContext = new YourDbContext("ConnectionString1");
        }
        else
        {
            YourContext = new YourDbContext("ConnectionString2");
        }
于 2012-09-21T13:22:17.007 に答える