从Entity Framework中是否有一条命令来检查数据库是否存在?

9
我可能表达不够清楚,但在我的 global.asx 文件中,我使用了以下代码:

 if (System.Diagnostics.Debugger.IsAttached)
        {
            var test = new TestDbSeeder(App_Start.NinjectWebCommon.UcxDbContext);
            test.seed();
       }

这段代码检查调试器是否已连接,并运行我的测试生成器,以便我的验收测试始终通过。

我还需要检查数据库是否存在,如果不存在,先运行以下代码:

  var test2 = new DataSeeder();
  test2.Seed(App_Start.NinjectWebCommon.UcxDbContext);

这个数据填充器是实际上必须始终存在于数据库中的数据。是否有命令可以检查数据库是否存在,以便我可以运行该代码块。谢谢!

2个回答

22

Database.Exists 这个方法能满足你的需求吗?

if (!dbContext.Database.Exists())
    dbContext.Database.Create();

编辑 #1 以回答评论

public class DatabaseBootstrapper
{
    private readonly MyContext context;

    public DatabaseBootstrapper(MyContext context)
    {
        this.context = context;
    }

    public void Configure()
    {
        if (context.Database.Exists())
            return;

        context.Database.Create();
        var seeder = new Seeder(context);
        seeder.SeedDatabase();
    }
}

那应该正好符合您的要求。在您的 global.asax 文件中...

public void Application_Start()
{
    var context = ...; // get your context somehow.
    new DatabaseBootstrapper(context).Configure();
}

也许你知道在哪里可以看到如何使用它的示例吗?我正在谷歌搜索,但没有找到任何相关内容。 - Robert
我通常在我的测试中有一个TestHelper类,可以执行诸如启动数据库、内存中的HTTP服务器等操作。因此,在我的测试装置设置中,我可以调用TestHelper.CreateDatabase(),这正是上面的代码。然后在我的测试装置拆卸中,我调用TestHelper.DestroyDatabase()。就是这么简单。 - Jarrett Meyer
1
我认为那不是我正在寻找的东西。我希望访问global.asx文件中的某些内容,以检查数据库是否存在,如果不存在,则运行我的seeder。如果存在,则跳过此步骤。 - Robert
这是同样的事情。创建新的EF DBContext。检查数据库是否存在。如果不存在,则创建并填充它。请参见即将发布的编辑。 - Jarrett Meyer

3
在Entity Framework Core中,它的工作原理如下:
namespace Database
{
    using Microsoft.EntityFrameworkCore.Infrastructure;
    using Microsoft.EntityFrameworkCore.Storage;

    public partial class MyContextClass
    {
        /// <summary>
        /// Checks if database exists
        /// </summary>
        /// <returns></returns>
        public bool Exists()
        {
            return (this.Database.GetService<IDatabaseCreator>() as RelationalDatabaseCreator).Exists();
        }
    }
}

确保类名与数据库上下文类名相同并位于相同的命名空间中。

使用方法如下:

var dbExists = (MyContextClass)db.Exists()

Source: StackOverflow Answer


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接