2013-10-06 105 views
26

我有一個通過實體框架連接到MYSQL數據庫的應用程序。它完美地工作,但我想添加一小段代碼,在應用程序啓動時測試與數據庫的連接。測試實體框架數據庫連接

我的想法只是簡單地向數據庫運行一個小命令並捕獲任何異常,但是如果出現問題(例如App.Config丟失或數據庫服務器關閉),應用程序需要大量時間來運行代碼,然後拋出異常(〜1分鐘)。我想這是由於連接超時等,但我已擺弄這些屬性無濟於事。

任何人都可以幫助任何想法去哪裏?

+0

一件事將是ping服務器,以檢查其是否在運行。 – Tauseef

+0

'公共PingReply發送( \t串hostNameOrAddress )' http://msdn.microsoft.com/en-us/library/7hzczzed.aspx – Tauseef

回答

37

你只是想看看數據庫連接是否有效。如果是的話就來看看在

using (DatabaseContext dbContext = new DatabaseContext()) 
{ 
    dbContext.Database.Exists(); 
} 

http://msdn.microsoft.com/en-us/library/gg696617(v=vs.103).aspx EF5 https://msdn.microsoft.com/en-us/library/gg696617(v=vs.113).aspx爲EF6

和檢查,如果一臺服務器機啓動之後,DB服務器或Web服務的服務器,試試這個:

public PingReply Send(string hostNameOrAddress)

http://msdn.microsoft.com/en-us/library/7hzczzed.aspx

+8

我通過採取在SQL Server和數據庫分貝 '離線' 測試這一點。 Exists()仍然返回true。注意... –

+1

最好的方法是使用mysql dll conector並手動執行。如果您使用遷移,它將返回false,但連接正常! – Daniloloko

+1

這不適用於MS SQL,Exists返回true,並且DBSet.Load同時發出異常。 – Sandor

7

我將此代碼用於我的項目:

private bool TestConnectionEF() 
     { 
      using (var db = new SistemaContext()) 
      { 
       try 
       { 
        db.Database.Connection.Open(); 
        if (db.Database.Connection.State == ConnectionState.Open) 
        { 
         Console.WriteLine(@"INFO: ConnectionString: " + db.Database.Connection.ConnectionString 
          + "\n DataBase: " + db.Database.Connection.Database 
          + "\n DataSource: " + db.Database.Connection.DataSource 
          + "\n ServerVersion: " + db.Database.Connection.ServerVersion 
          + "\n TimeOut: " + db.Database.Connection.ConnectionTimeout); 
         db.Database.Connection.Close(); 
         return true; 
        } 
        return false; 
       } 
       catch(Exception ex) 
       { 
        throw new Exception(ex.Message + " \n PING: " + TryPing(db.Database.Connection.DataSource).ToString()); 
       } 
      } 
     } 
+0

什麼是TryPing? –

20

爲@Daniloloko該解決方案指出的是調用DbContext.Database.Connection.Open()

它與EF6測試。

我implementaion:

public static bool CheckConnection() 
    { 
     try 
     { 
      MyContext.Database.Connection.Open(); 
      MyContext.Database.Connection.Close(); 
     } 
     catch(SqlException) 
     { 
      return false; 
     } 
     return true; 
    } 
+0

我最喜歡這個解決方案,是的,你不應該使用流邏輯的異常(通常;-)) –

+0

我會將此添加到單元測試。 –

+0

我知道,如果我想確保MySQL服務器在與數據庫的每次交互中都處於運行狀態,那麼我需要爲每個單獨的操作執行if(CheckConnection()){..}'(爲了避免應用程序錯誤如果MySQL服務器關閉)。任何想法如何在全球範圍內實施此檢查?所以不需要調用和重新調用CheckConnection()'? –