【问题标题】:Entity Framework Core - How to check if database exists?Entity Framework Core - 如何检查数据库是否存在?
【发布时间】:2016-02-27 22:28:39
【问题描述】:

对于EF6,我可以通过以下方式检查数据库是否存在:

context.Database.Exists()

如何在 EF Core 中执行此操作?

【问题讨论】:

    标签: entity-framework-core


    【解决方案1】:

    我自己找到了解决办法:

    (context.GetService<IDatabaseCreator>() as RelationalDatabaseCreator).Exists()
    

    它适用于 SqlServer 的 EF 7.0.0-rc1-final 版本

    更新:

    实体框架核心 2.0:

    (context.Database.GetService<IDatabaseCreator>() as RelationalDatabaseCreator).Exists()
    

    【讨论】:

    • 实体框架核心 2.0:(context.Database.GetService&lt;IDatabaseCreator&gt;() as RelationalDatabaseCreator).Exists()
    • 对于 EF Core 2.0:不需要强制转换,只需使用 context.Database.GetService() 代替
    • 我遇到了 EF Core 3.1 的奇怪问题。我需要在我的代码中手动添加using Microsoft.EntityFrameworkCore.Infrastructure;。 Intellisense 没有告诉我我需要做什么才能获得 GetService() 方法。
    • 对我来说在 EF 3.1 中工作不正确。例如数据库存在但 Exists() 方法返回 false
    • 请注意,如果数据库只是脱机或由于权限而用户无法访问,这也会报告错误。换句话说,这真的不是“存在”,而是更像是“我现在可以连接到它吗”。
    【解决方案2】:

    更新 .Net Core 3.1

    检查数据库是否存在并且可以联系:

    dbContext.Database.CanConnect()
    

    【讨论】:

    • 如果数据库不存在则抛出SqlException错误。
    • @RachaneeSaengkrajai 如果无法与 SQL 服务器连接,它会抛出异常。如果数据库不存在但服务器可以访问,则返回false。
    • 对我来说它在两种情况下都返回 false。不会抛出异常。
    • 坦率地说,我比接受的答案更喜欢这个答案,因为它很清楚你在问什么。 Exists() 方法确实不比这个好。
    【解决方案3】:

    其他解决方案告诉您数据库是否可连接

    context.Database.GetService<IRelationalDatabaseCreator>().Exists();  //true
    context.Database.EnsureDeleted();
    context.Database.GetService<IRelationalDatabaseCreator>().Exists();  //true
    

    我想知道数据库是否存在

    context.Database.GetService<IRelationalDatabaseCreator>().HasTables();  //true
    context.Database.EnsureDeleted();
    context.Database.GetService<IRelationalDatabaseCreator>().HasTables();  //false
    

    注意这个奇怪的行为:

    context.Database.EnsureDeleted();
    context.Database.GetService<IRelationalDatabaseCreator>().HasTables();  //false
    context.Database.EnsureCreated();
    context.Database.GetService<IRelationalDatabaseCreator>().HasTables();  //true
    context.Database.EnsureDeleted();
    context.Database.GetService<IRelationalDatabaseCreator>().HasTables();  //true !!
    

    所以它并不完美,但根据您的用例,它可能很有用。

    【讨论】:

    • Exists()EnsureDeleted() 被调用后会为我返回false
    猜你喜欢
    • 2018-02-27
    • 1970-01-01
    • 2018-04-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多