测试实体框架数据库连接

Ste*_*ood 33 c# mysql testing entity-framework database-connection

我有一个通过实体框架连接到MYSQL数据库的应用程序.它100%完美地工作,但我想添加一小段代码,在app启动时测试与数据库的连接.

我只想简单地向数据库运行一个小命令并捕获任何异常,但是如果出现问题(例如App.Config缺失或数据库服务器关闭),应用程序需要花费大量时间来运行此代码然后抛出例外(约1分钟).我想这是由于连接超时等,但我摆弄这些属性无济于事.

是否有人能够协助任何想法去哪儿?

Tau*_*eef 43

您只是想查看数据库连接是否有效.如果有的话,看看

using (DatabaseContext dbContext = new DatabaseContext())
{
     dbContext.Database.Exists();
}
Run Code Online (Sandbox Code Playgroud)

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 for EF6

并且要检查服务器计算机是否已启动,数据库服务器或Web服务服务器,请尝试以下操作:

public PingReply Send( string hostNameOrAddress )

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

  • 我通过在SQL Server和Database中使用db'offline'来测试这个.Exists()仍然返回true.需要注意的事情...... (9认同)
  • '我相信上述解决方案适用于早于 EF6 的 EF 版本' 事实上,在发布答案时 EF6 并不存在。感谢您发布详细信息,如果需要,我会查看并更新答案。 (2认同)

San*_*dor 33

@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;
    }
Run Code Online (Sandbox Code Playgroud)


Dan*_*eda 10

我将这段代码用于我的项目:

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;
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)


Hec*_* S. 8

我知道这是一个老问题,但这是我对任何寻求新实现的人的回答。

我能够用来CanConnect检查数据库的状态:

_database.Database.CanConnect();

# Async too
await _database.Database.CanConnectAsync(_cancellationTokenSource.Token);
Run Code Online (Sandbox Code Playgroud)

我希望这也对其他人有帮助。干杯!


use*_*870 7

在EntityFramework Core中,您可以简单地调用:Database.CanConnect();

(使用EF Core 2.2.1)

  • 另请注意,当数据库服务器离线时,`CanConnect` 不会返回 false,它会抛出异常 (3认同)