2013-10-06 4 views
26

У меня есть приложение, которое подключается к базе данных MYSQL через инфраструктуру сущности. Он работает на 100% отлично, но я хотел бы добавить небольшой фрагмент кода, который будет проверять соединение с базой данных при запуске приложения.Тестирование соединения базы данных Entity Framework

У меня возникла идея просто запустить крошечную команду в базу данных и перехватить любые исключения, однако, если есть проблема (например, отсутствует App.Config или сервер базы данных), приложение занимает огромное количество времени для запуска этого кода, а затем выбросить исключение (~ 1 мин). Я предполагаю, что это связано с тайм-аутами соединения и т. Д., Но я искал такие свойства безрезультатно.

Может ли кто-нибудь помочь с любыми идеями относительно того, куда идти?

+0

одна вещь будет пинговать сервер, чтобы проверить, если он вверх. – 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, попробуйте следующее:

public PingReply Send(string hostNameOrAddress)

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

+8

Я испытал это, беря дб 'автономный' в SQL Server и базы данных. Exists() все еще вернётся. Что-то, на что нужно обратить внимание ... –

+1

Лучше всего использовать коннектор dll mysql и сделать это вручную. Если вы используете миграции, он вернет 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

Я бы добавил это к Unit Tests. –

+0

Я понимаю, что если я хочу, чтобы сервер MySQL работал над каждым взаимодействием с БД, мне нужно выполнить 'if (CheckConnection()) {..}' для каждого отдельного действия (во избежание ошибок приложения в если сервер MySQL не работает). Любая идея, как реализовать эту проверку на более глобальном уровне? Таким образом, не нужно было бы звонить и повторно вызывать 'CheckConnection()'? –

Смежные вопросы