エンティティフレームワークを介してMYSQLデータベースに接続するアプリがあります。 100%完全に機能しますが、アプリの起動時にデータベースへの接続をテストする小さなコードを追加したいと思います。
データベースに対して小さなコマンドを実行して例外をキャッチするというアイデアがありましたが、問題(App.Configの欠落やデータベースサーバーのダウンなど)がある場合、アプリがこのコードを実行してスローするのに膨大な時間がかかります例外(〜1分)。これは接続タイムアウトなどによるものだと思いますが、そのようなプロパティをいじっては役に立ちません。
誰がどこへ行くかについてのアイデアを手伝うことができますか?
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 )
@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;
}
私は自分のプロジェクトにこのコードを使用します:
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;
}
}
}
EntityFramework Coreでは、単にDatabase.CanConnect();
を呼び出すことができます。
(EF Core 2.2.1を使用)
@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;
}