即使数据库当前正在使用,如何删除它[实体框架]

时间:2016-06-30 16:04:42

标签: c# entity-framework ef-code-first entity-framework-6

我正在尝试创建一个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行时发送。

1 个答案:

答案 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是。\你必须改变它们!只需硬编码您的数据库/服务器名称进行测试,测试后您可以从配置文件中读取连接字符串作为上一节中的描述。