使用EntityFramework删除并重新创建数据库

本文关键字:创建 数据库 新创建 EntityFramework 删除 使用 | 更新日期: 2023-09-27 17:59:47

我们使用的是EF 6,对于一些集成测试,我们希望完全删除数据库,并使用数据库上下文重新创建它。

我们试图获得数据库的独占使用权,但却获得了一个正在使用的数据库errror。这就是我们尝试的:

    private void CreateDatabase()
    {
        MyDbContext context = new MyDbContext();
        SqlConnection sqlConnection = context.Database.Connection as SqlConnection;
        LockDb(sqlConnection);
        context.Database.Delete();
        context.Database.CreateIfNotExists();
        UnLockDb(sqlConnection);
        _context = context;
    }
    private void LockDb(SqlConnection connection)
    {
        const string cmdText = 
            "USE[master];"
            + "IF exists(select * from sys.databases where name = 'MyDb')"
            + "BEGIN"
            + "  ALTER DATABASE[MyDb] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;"
            + "END;";
        OpenConnection(connection);
        ExecuteCommand(connection, cmdText);
    }

我们缺少什么?

使用EntityFramework删除并重新创建数据库

我不是唯一一个有这个问题的人,在这里找到了答案(当然是在堆栈上)

诀窍是在一个SQL语句中删除数据库

    private void DeleteDb(SqlConnection connection)
    {
        const string cmdText = 
            "USE[master];"
            + "IF exists(select * from sys.databases where name = 'Tor')"
            + "BEGIN"
            + "  ALTER DATABASE[Tor] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;"
            + "  DROP DATABASE [Tor];"
            + "END;";
        OpenConnection(connection);
        ExecuteCommand(connection, cmdText);
    }

更新

即使是上面的也不是防弹的。

现在正在使用:

    private void CreateDatabase()
    {
        TorDbContext context = new TorDbContext();
        context.Database.Delete();
        context.Database.Create();
        _context = context;
    }

只要我们在Management Studio中没有打开查询,就可以工作。它不会影响我们的集成测试。。。