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