web-dev-qa-db-ja.com

EntityFramework 6.0 CreateDatabaseIfNotExistsコードは最初にデータベースを作成します

何が悪いのでしょうか。 Powershellを使用して最初にCode-Firstを作成したときに、ユーザーDbContextを設定して動作していますが、すべて正常に機能しました。

アプリケーションの起動時に予想どおりにDatabase Initializerを実装しました。

Database.SetInitializer<UserDbContext>(new CreateDatabaseIfNotExists<UserDbContext>());

実際にデータベースが作成されるかどうかをテストするために、実際にデータベースを削除しましたが、データベースが作成されないので困っています。私はSQL Server 2012を使用しています。

私が得ているエラーメッセージは

System.InvalidOperationException: Migrations is enabled for context 'UserDbContext' but the database does not exist or contains no mapped tables. Use Migrations to create the database and its tables, for example by running the 'Update-Database' command from the Package Manager Console.

パッケージマネージャーコンソールから同じことを試しましたが、それでも同じメッセージが表示されます。

11
Sanj

最終的に解決策を考え出したが、その理由や理由はわからない。データベースの初期化子を、CreateDatabaseIfNotExistsが機能する代わりにMigrateDatabaseToLatestVersionに変更しました。

Database.SetInitializer<UserDbContext>(new MigrateDatabaseToLatestVersion<UserDbContext, Configuration>());
14
Sanj

編集:新しいエラーメッセージの問題は、移行を有効にして既に移行(おそらくデータベースの最初の作成)を実行していて、DBを削除してから移行履歴が失われたことが原因です。自動マイグレーションを使用していない場合、自分でデータベースにアクセスして変更を加えることはできず、コードファーストがそれを知ることを期待できます。移行を無効にしてから再度有効にして、移行履歴がクリアされるかどうかを確認してください。

最初に作成するDBのデータの読み取りまたは挿入として、DBを呼び出す必要があります。使用するコードは、EFがデータベースを見つけようとしたときに、データベースが存在しない場合の対処方法のみをEFに通知します。私は http://www.codeproject.com/Tips/411288/Ensure-Your-Code-First-DB-is-Always-Initialized で説明されている方法を使用します

2