C# 如何删除当前正在使用的数据库[实体框架]
我正在尝试创建一个DbContextInitializer,我从DropCreateDatabaseAlways继承了它,但是它没有按预期工作C# 如何删除当前正在使用的数据库[实体框架],c#,entity-framework,ef-code-first,entity-framework-6,C#,Entity Framework,Ef Code First,Entity Framework 6,我正在尝试创建一个DbContextInitializer,我从DropCreateDatabaseAlways继承了它,但是它没有按预期工作 public void InitializeDatabase(DbContext context) { if (context.Database.Exists()) { context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransacti
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 Profiler进行调试)
有人能告诉我怎么执行吗
在它试图删除数据库之前
顺便说一下,dop命令在点击ExecuteSQL命令行时被发送。您可以使用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是。\n您必须更改它们!只需硬编码您的数据库/服务器名称以进行测试,测试后,您可以从配置文件中读取连接字符串,如前一节中所述。我尝试使用此名称和“Get System.Data.SqlClient.SqlException:无法删除数据库“DatabaseName”,因为它当前正在使用中”在ExecuteOnQuery Linear,您确定您有权限删除数据库吗?您可以使用SSM执行此操作吗?并且此代码不得位于DropCreateDatabaseAlways inherted类中。此代码必须从外部调用
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();
}