我有一個通過實體框架連接到MYSQL數據庫的應用程序。它完美地工作,但我想添加一小段代碼,在應用程序啓動時測試與數據庫的連接。測試實體框架數據庫連接
我的想法只是簡單地向數據庫運行一個小命令並捕獲任何異常,但是如果出現問題(例如App.Config丟失或數據庫服務器關閉),應用程序需要大量時間來運行代碼,然後拋出異常(〜1分鐘)。我想這是由於連接超時等,但我已擺弄這些屬性無濟於事。
任何人都可以幫助任何想法去哪裏?
我有一個通過實體框架連接到MYSQL數據庫的應用程序。它完美地工作,但我想添加一小段代碼,在應用程序啓動時測試與數據庫的連接。測試實體框架數據庫連接
我的想法只是簡單地向數據庫運行一個小命令並捕獲任何異常,但是如果出現問題(例如App.Config丟失或數據庫服務器關閉),應用程序需要大量時間來運行代碼,然後拋出異常(〜1分鐘)。我想這是由於連接超時等,但我已擺弄這些屬性無濟於事。
任何人都可以幫助任何想法去哪裏?
你只是想看看數據庫連接是否有效。如果是的話就來看看在
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)
我通過採取在SQL Server和數據庫分貝 '離線' 測試這一點。 Exists()仍然返回true。注意... –
最好的方法是使用mysql dll conector並手動執行。如果您使用遷移,它將返回false,但連接正常! – Daniloloko
這不適用於MS SQL,Exists返回true,並且DBSet.Load同時發出異常。 – Sandor
我將此代碼用於我的項目:
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());
}
}
}
什麼是TryPing? –
爲@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;
}
我最喜歡這個解決方案,是的,你不應該使用流邏輯的異常(通常;-)) –
我會將此添加到單元測試。 –
我知道,如果我想確保MySQL服務器在與數據庫的每次交互中都處於運行狀態,那麼我需要爲每個單獨的操作執行if(CheckConnection()){..}'(爲了避免應用程序錯誤如果MySQL服務器關閉)。任何想法如何在全球範圍內實施此檢查?所以不需要調用和重新調用CheckConnection()'? –
一件事將是ping服務器,以檢查其是否在運行。 – Tauseef
'公共PingReply發送( \t串hostNameOrAddress )' http://msdn.microsoft.com/en-us/library/7hzczzed.aspx – Tauseef