Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何删除当前正在使用的数据库[实体框架]_C#_Entity Framework_Ef Code First_Entity Framework 6 - Fatal编程技术网

C# 如何删除当前正在使用的数据库[实体框架]

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

我正在尝试创建一个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 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();
}