MVC 4、Entity Framework 5、および Code First アプローチを使用しています。
モデルに変更を加えてアプリケーションを実行すると、使用中のためデータベースを削除できないというエラーが表示されます。
これを解決するために、次のIDatabaseInitializer
ような単一の接続を強制する独自のものを実装しました。
public class ForceDropCreateDatabaseInitializer<T> : IDatabaseInitializer<T> where T : DbContext, new()
{
public ForceDropCreateDatabaseInitializer(Action<T> seed = null)
{
Seed = seed ?? delegate { };
}
public Action<T> Seed { get; set; }
public void InitializeDatabase(T context)
{
if (context.Database.Exists())
{
string databaseName = context.Database.Connection.Database;
string alterStatement = "ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE";
string dropStatement = "USE [master] DROP DATABASE [{0}]";
context.Database.ExecuteSqlCommand(alterStatement, databaseName);
context.Database.ExecuteSqlCommand(dropStatement, databaseName);
}
context.Database.Create();
Seed(context);
}
}
しかし、今、次の行で権限エラーが発生しています。
context.Database.ExecuteSqlCommand(alterStatement, databaseName);
例外メッセージ:
ユーザーにデータベース '@p0' を変更する権限がないか、データベースが存在しないか、データベースがアクセス チェックを許可する状態ではありません。
ALTER DATABASE ステートメントが失敗しました。
パラメータを使用しているため、@p0が使用されていると思います。モデルを変更するたびに、このエラーを回避し、データベースを正常に削除して作成するにはどうすればよいですか?