J'ai une application qui se connecte à une base de données MYSQL via le framework d'entité. Cela fonctionne parfaitement à 100%, mais je voudrais ajouter un petit morceau de code qui testera la connexion à la base de données au démarrage de l'application.
J'ai eu l'idée d'exécuter simplement une petite commande dans la base de données et de détecter toutes les exceptions, mais s'il y a un problème (par exemple, App.Config manquant ou serveur de base de données en panne), l'application prend beaucoup de temps pour exécuter ce code, puis lancer l'exception (~ 1 min). J'imagine que cela est dû à des délais d'attente de connexion, etc., mais j'ai tripoté de telles propriétés en vain.
Quelqu'un serait-il en mesure d'aider avec des idées sur où aller?
Voulez-vous simplement voir si la connexion DB est valide. Si c'est le cas, jetez un œil à la
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 pour EF6
et pour vérifier si une machine serveur est en marche, un serveur DB ou un serveur de services Web, essayez ceci:
public PingReply Send( string hostNameOrAddress )
La solution, comme l'a souligné @Danilo Breda, consiste à appeler DbContext.Database.Connection.Open ()
Il est testé avec EF6.
Mon implémentation:
public static bool CheckConnection()
{
try
{
MyContext.Database.Connection.Open();
MyContext.Database.Connection.Close();
}
catch(SqlException)
{
return false;
}
return true;
}
J'utilise ce code pour mon projet:
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;
}
}
}
Dans EntityFramework Core, vous pouvez simplement appeler: Database.CanConnect();
.
(en utilisant EF Core 2.2.1)
J'ai utilisé la réponse de @Sandor et j'ai fait une méthode d'extension à utiliser avec EntityFramework Core.
Voici le code:
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;
}
}
}
}
Il ne vous reste plus qu'à appeler:
if (!context.TestConnection())
{
logger.LogInformation("No database connection. Check the connection string in settings.json. {0}", configuration["connectionString"]);
return;
}