2013-10-06 31 views
26

エンティティフレームワークを使用してMYSQLデータベースに接続するアプリケーションがあります。 100%完全に動作しますが、アプリケーションの起動時にデータベースへの接続をテストする小さなコードを追加したいと思います。Entity Frameworkデータベース接続のテスト

データベースに小さなコマンドを実行して例外をキャッチするという考えがありましたが、問題がある場合(App.Configが見つからない、またはデータベースサーバーがダウンしているなど)、このアプリケーションを実行するには膨大な時間がかかりますコードを作成し、例外をスローします(〜1分)。私はこれが接続タイムアウトなどに起因すると思いますが、私はこのようなプロパティを無駄にしてしまいました。

誰でもどこへ行くかについてのアイデアは誰でも手に入りますか?

+0

一つのことは、それがアップしているかどうかを確認するためにサーバーにpingを実行することです。 – Tauseef

+0

'PingReplyを送るパブリック( \t文字列hostNameOrAddress )' http://msdn.microsoft.com/en-us/library/7hzczzed.aspx – Tauseef

答えて

37

DB接続が有効かどうかを確認したいだけですか?

public PingReply Send(string hostNameOrAddress)

:EF6

用とサーバマシンが起動している場合、DBサーバやWebサービスサーバーをチェックするための

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を見てみましょうもしそうなら、これを試してみてください

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

+8

は、私はSQL Serverとデータベース内のdb 'オフライン' を取ることで、これをテストしました。 Exists()は依然としてtrueを返しました。何か気にするもの... –

+1

最も良い方法は、mysql dll conectorを使用して手動で行うことです。移行を使用すると、falseが返されますが、接続はOKです! – 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サーバがDBとのやりとりのたびに稼働していることを確認したいと思ったら、各アクションごとに 'if(CheckConnection()){..}'を実行する必要があることを理解していますMySQLサーバがダウンしている場合)。よりグローバルなレベルでこのチェックをどのように実装するか考えていますか?だから、 'CheckConnection()'を呼び出して再呼び出しする必要はありません。 –

関連する問題