web-dev-qa-db-ja.com

Entity Frameworkデータベース接続のテスト

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

データベースに対して小さなコマンドを実行して例外をキャッチするというアイデアがありましたが、問題(App.Configの欠落やデータベースサーバーのダウンなど)がある場合、アプリがこのコードを実行してスローするのに膨大な時間がかかります例外(〜1分)。これは接続タイムアウトなどによるものだと思いますが、そのようなプロパティをいじっては役に立ちません。

誰がどこへ行くかについてのアイデアを手伝うことができますか?

33
Steven Wood

DB接続が有効かどうかを確認するだけです。もしそうなら

_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

42
Tauseef

@Danilo Bredaが指摘した解決策は、DbContext.Database.Connection.Open()を呼び出すことです

EF6でテストされています。

私の実装:

    public static bool CheckConnection()
    {
        try
        {
            MyContext.Database.Connection.Open();
            MyContext.Database.Connection.Close();
        }
        catch(SqlException)
        {
            return false;
        }
        return true;
    }
33
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 ex;
                }
            }
        }
9
Danilo Breda

EntityFramework Coreでは、単にDatabase.CanConnect();を呼び出すことができます。

(EF Core 2.2.1を使用)

3
user2457870

@Sandorからの回答を使用し、EntityFramework Coreで使用する 拡張メソッド を実行しました。

コードは次のとおりです。

using Microsoft.EntityFrameworkCore;
using System.Data.Common;

namespace TerminalInventory
{
    public static class ExtensionMethods
    {
        public static bool TestConnection(this DbContext context)
        {
            DbConnection conn = context.Database.GetDbConnection();

            try
            {
                conn.Open();   // Check the database connection

                return true;
            }
            catch
            {
                return false;
            }
        }
    }
}

今、あなたは電話するだけです:

if (!context.TestConnection())
{
    logger.LogInformation("No database connection. Check the connection string in settings.json. {0}", configuration["connectionString"]);

    return;
}
1