2016-06-30 4 views
1

DbContextInitializerを作成しようとしていて、DropCreateDatabaseAlwaysから継承しました。<>ただし、希望通りに機能しませんでした。データベースが現在使用中であっても削除する方法[Entity Framework]

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

あなただけの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は\です。あなたはそれらを変更する必要があります!テストのためにあなたのデータベース/サーバー名を単にハードコードし、テストの後、前のセクションの説明と同じように、接続ファイルをconfigファイルから読み取ることができます。

+0

これを使用してみましたが、「ExecuteNonQuery」行で「System.Data.SqlClient.SqlException:データベースを削除できません」DatabaseName「現在使用中です」 – chandler

+0

データベースを削除する権限がありますかそれはSSMとは? –

+0

このコードは、DropCreateDatabaseAlways継承クラス内にあってはならず、このコードは外部からの呼び出しである必要があります –

関連する問題