我正在使用DbContext处理带有EntityFramework主干的C#应用程序。 该应用程序有两种选择:连接到远程SQL Server express或连接到本地SQL compact 4.0数据库,以防网络连接不可用。 当我的应用程序启动时,一个线程正在检查是否可以连接到远程数据库。否则,它自动需要切换连接字符串和提供程序以连接到本地数据库。 到目前为止,我试图通过修改app.config中的连接字符串部分来处理这个问题,并在保存配置后强制应用程序刷新该部分。这种方法不是最好的,因为我需要具有写入app.config文件的访问权限。 你能建议一个更好的方法吗?
答案 0 :(得分: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);
}
}
}
答案 1 :(得分:0)
DbContext构造函数接受连接字符串的名称或您要选择的实际连接字符串。
你可以做的是测试你的初始连接字符串 - 可能是快速的ado连接或简单的东西,然后如果它连接使用它,否则使用你的另一个连接。
一些伪代码:
YourDbContext YourContext;
if (TestConnection())
{
YourContext = new YourDbContext("ConnectionString1");
}
else
{
YourContext = new YourDbContext("ConnectionString2");
}