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