如何检查 Entity Framework Core 中与数据库的连接?

How to check connection to database in Entity Framework Core?

在正常情况下 entity framework 我可以使用 dbContext.Database.Exists() 检查数据库连接,但在 Entity Framework Core 中它不存在。 Entity Framework Core 中 dbContext.Database.Exists() 的替代项是什么?

目前(目前最新的EF Core 2.0)DatabaseFacadeclass(即DbContext.Database属性的类型)不暴露公开 Exists 方法。

但是,EF Core IRelationalDatabaseCreator 服务提供了对应的 EF6 方法的等价物。您可以使用这样的自定义扩展方法公开它:

using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage;

public static class DatabaseFacadeExtensions
{
    public static bool Exists(this DatabaseFacade source)
    {
        return source.GetService<IRelationalDatabaseCreator>().Exists();
    }
}

但请注意,Exists 方法从未打算检查数据库连接,而是检查是否需要创建数据库(在调用 EnsureCreated 等方法时内部使用), Migrate 等等)。

"Exists()"方法只检查数据库是否存在,并没有真正检查您的应用程序是否可以连接到数据库。例如:即使连接字符串中的密码错误,Exists() 方法也会 return 为真。 所以根据我的说法,更好的解决方案是打开连接并检查其中是否发生任何异常。

        try
        {
             dbContext.Database.OpenConnection();
             dbContext.Database.CloseConnection();
             return true;
        }
        catch (Exception ex)
        {
            return false;
        }

但是如果你仍然想使用 Exists() 那么你可以这样使用

dbContext.Database.GetService<IRelationalDatabaseCreator>().Exists();

您可以使用CanConnect()方法确定数据库是否可用以及是否可以连接:

if (dbContext.Database.CanConnect())
{
    // all good
}

您可以使用 CanConnectAsync() 进行异步操作。