2013-10-06 68 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()'? –