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

时间:2016-08-01 15:11:28

标签: c# entity-framework

我们正在使用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);
    }

我们缺少什么?

1 个答案:

答案 0 :(得分:1)

好吧,我不是唯一一个遇到此问题的人找到答案here (on stack ofcourse)

诀窍是在单个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中没有打开查询,就可以正常工作。它不会打扰我们的集成测试...