【问题标题】:How to check connection to database in Entity Framework Core?如何在 Entity Framework Core 中检查与数据库的连接?
【发布时间】:2018-02-27 08:32:31
【问题描述】:

在普通实体框架中,我可以使用 dbContext.Database.Exists() 检查数据库连接性,但在 Entity Framework Core 中它不存在。 Entity Framework Core 中dbContext.Database.Exists() 的替代品是什么?

【问题讨论】:

  • 你的意思是检查连接状态吗?
  • 我只是想检查我的连接字符串是否有效,是否可以成功连接数据库。
  • 您可以在连接实例中查看Status属性

标签: entity-framework-core database-connection exists


【解决方案1】:

目前(截至目前最新的 EF Core 2.0)DatabaseFacade 类(这是 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 方法从未用于检查数据库连接性,而是检查是否需要创建数据库(当您调用 EnsureCreatedMigrate 等方法时在内部使用) .

【讨论】:

  • 您认为测试数据库运行状况的好方法是什么?我正在尝试在我的负载均衡器健康检查中实现一个。
  • 怎么样:await _context.Database.ExecuteSqlCommandAsync("SELECT 1");
  • @ArcadeRenegade 我不能确切地说。我将创建(又一个)自定义(扩展)方法并使用实现 - 我设想它更像 OpenConnection / CloseConnection 调用对。
【解决方案2】:

“Exists()”方法只检查数据库是否存在,它并没有真正检查你的应用程序是否可以连接到数据库。例如:如果连接字符串中的密码错误,那么 Exists() 方法将返回 true。 所以根据我的说法,更好的解决方案是打开连接并检查其中是否发生任何异常。

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

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

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

【讨论】:

    【解决方案3】:

    可以通过CanConnect()方法判断数据库是否可用,是否可以连接:

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

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

    【讨论】:

    • CanConnect() 在发表此评论时适用于 Entity Framework Core 2.2 和 3.0。 Source
    • 如果你的服务器离线,CanConnect() 会抛出一个异常,它并不总是返回真/假。你们注意到了吗?
    • @Tony,最近有一个recent issue on Github 与此有关。它应该自己处理异常并在连接失败的情况下返回 false。
    • @nmur 我明白了,谢谢你的参考。似乎它将在 5.0 及更高版本中可用。我们使用的是 3.1.x,但该修复没有及时完成。
    • 有没有办法查看我是否可以连接到服务器(即使数据库不存在),例如,这个连接是否允许我创建数据库我应该选择吗?
    猜你喜欢
    • 2021-10-02
    • 2016-02-27
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2018-03-24
    相关资源
    最近更新 更多