web-dev-qa-db-fra.com

Test d'une connexion à une base de données Entity Framework

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?

33
Steven Wood

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 )

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

42
Tauseef

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;
    }
33
Sandor

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;
                }
            }
        }
9
Danilo Breda

Dans EntityFramework Core, vous pouvez simplement appeler: Database.CanConnect();.

(en utilisant EF Core 2.2.1)

3
user2457870

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;
}
1
Leniel Maccaferri