1

我处理与利用的DbContext一个的EntityFramework骨干C#应用程序自动切换连接字符串。 应用程序有两种选择:连接到远程的SQL Server Express或连接的情况下,本地SQL紧凑4.0数据库中的网络连接不可用。 当我的应用程序启动时,线程正在检查是否可以连接到远程数据库。否则,它将自动需要切换连接字符串和提供程序以连接到本地数据库。 到目前为止,我试图通过修改的app.config连接字符串部分,并迫使应用程序刷新部分,保存配置后,处理这个问题。这种方法不是最好的,因为我需要有访问权限才能写入app.config文件。 你能提出一个更好的方法吗?数据库连接错误

+0

你在哪里存储两个连接字符串? – pleinolijf

+0

在一个类中的两个常量 – Francesco

回答

0

DbContext构造器接受连接的名称字符串或您想要选择的实际连接字符串。

你可以做什么,是测试你的初始连接字符串 - 也许有一个快速的ADO连接或简单的东西,然后如果它连接使用它,否则连接使用另一种。

一些伪代码:

 YourDbContext YourContext; 
     if (TestConnection()) 
     { 
      YourContext = new YourDbContext("ConnectionString1"); 
     } 
     else 
     { 
      YourContext = new YourDbContext("ConnectionString2"); 
     } 
+0

如何设置数据库提供程序?我需要一个SQL Server Express的和SQL紧凑4.0 – Francesco

+0

到基准之间进行切换“的ConnectionString”可以在你的app.config一个连接字符串的名称。如果可能的话,我只需在那里有两个连接字符串,并按名称引用它们。 –

+0

我不能拥有app.config中的字符串,我需要以编程方式指定它们。我试图在字符串中插入数据库名称并取回“关键字无效:数据库”异常。这怎么可能解决? – Francesco

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); 
     } 
    } 
} 
+0

感谢您的回答。这种设计方法似乎干净而有效,但除了将整体封装到类中之外,我的问题是另一个问题:如何告知entityframework引擎我切换连接字符串和数据库提供程序? – Francesco

+0

@Francesco您可以添加一个'Changed'事件让用户看到变化。有关详细信息,请参阅编辑。 – dasblinkenlight