我正在尝试创建一个DbContextInitializer,我继承自DropCreateDatabaseAlways<>但它没有按照要求工作。
public void InitializeDatabase(DbContext context)
{
if (context.Database.Exists())
{
context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction,
$"ALTER DATABASE [{context.Database.Connection.Database}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
context.Database.Delete();
context.Database.Create();
}
else
{
context.Database.Create();
}
}
问题是当它到达ExecuteSqlCommand时它会在运行命令之前尝试删除数据库(使用SQL事件探查器进行调试)
有人可以告诉我如何执行
ALTER DATABASE [{context.Database.Connection.Database}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
在尝试删除数据库之前?
顺便说一句,dop命令在命中ExecuteSqlCommand行时发送。
答案 0 :(得分:1)
您只需使用C#SQL命令:
System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder(connectionString);
string database = builder.InitialCatalog;
using(SqlConnection con = new SqlConnection(Connectionstring))
{
con.Open();
String sqlCommandText = @"
ALTER DATABASE " + database + @" SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE [" + database + "]";
SqlCommand sqlCommand = new SqlCommand(sqlCommandText, con);
sqlCommand.ExecuteNonQuery();
}
更新:此脚本将终止所有正在运行的进程,然后删除我刚测试的数据库并且它正常工作:
using (var con = new SqlConnection(@"Server =.\; Database = UsersDatabase; Integrated Security = True; "))
{
con.Open();
var sqlCommandText = @"USE master
DECLARE @kill varchar(8000) = '';
SELECT @kill = @kill + 'kill ' + CONVERT(varchar(5), spid) + ';'
FROM master..sysprocesses
WHERE dbid = db_id('UsersDatabase')
EXEC(@kill);
ALTER DATABASE UsersDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
drop database UsersDatabase";
var sqlCommand = new SqlCommand(sqlCommandText, con);
sqlCommand.ExecuteNonQuery();
}
我的数据库名称是UsersDatabase,我的SQL Server是。\你必须改变它们!只需硬编码您的数据库/服务器名称进行测试,测试后您可以从配置文件中读取连接字符串作为上一节中的描述。