使用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);
}
我们缺少什么?
我不是唯一一个有这个问题的人,在这里找到了答案(当然是在堆栈上)
诀窍是在一个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中没有打开查询,就可以工作。它不会影响我们的集成测试。。。