在普通实体框架中,我能够使用dbContext.Database.Exists()检查数据库连接,但在Entity Framework Core中它不存在。实体框架核心中dbContext.Database.Exists()的替代方法是什么?
目前(直到EF Core 2.0的最新版本)DatabaseFacade
类(这是DbContext.Database
属性的类型)不公开Exists
方法。
但是,相应的EF6方法由EF Core IRelationalDatabaseCreator
服务提供。您可以使用自定义扩展方法公开它,如下所示:
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()方法将返回true。因此,根据我的说法,更好的解决方案是打开连接并检查是否发生任何异常。
try
{
dbContext.Database.OpenConnection();
dbContext.Database.CloseConnection();
return true;
}
catch (Exception ex)
{
return false;
}
但如果您仍想使用Exists(),那么您可以这样使用
dbContext.Database.GetService<IRelationalDatabaseCreator>().Exists();