我们正在使用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);
}
我们缺少什么?
答案 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中没有打开查询,就可以正常工作。它不会打扰我们的集成测试...