[Entity Framework] Cannot drop database because it is currently in use. エラー

Entity Framework を使って実装したコードをローカルで実行した際に Initializer の Seed() でエラー。

型 'System.Data.SqlClient.SqlException' の例外が EntityFramework.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした
追加情報:Cannot drop database "[データベース名]" because it is currently in use.

unit testing – “Cannot drop database because it is currently in use”. How to fix? – Stack Overflow
前回の接続でエラーなどが発生した際に接続が残ってしまっているのが原因らしい。

Visual Studio を再起動することで直った。

ちなみに ALTER をかけるといいみたいだけど context.Database.Connection.Database が空文字列で返ってきてうまくいかなかった。
発生したエラーメッセージの [データベース名] を直接指定したら通った。(要検証)

public class CustomInitializer<T> : DropCreateDatabaseAlways<YourContext>
{
    public override void InitializeDatabase(YourContext context)
    {
        context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction
            , string.Format("ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE", context.Database.Connection.Database));
 
        base.InitializeDatabase(context);
    }
 
    protected override void Seed(YourContext context)
    {
        // Seed code goes here...
 
        base.Seed(context);
    }
}

カテゴリー: ASP.NET, Entity Framework パーマリンク