web-dev-qa-db-ja.com

EFコードファースト:DropCreateDatabaseIfModelChangesが機能しない

Global.asaxで次のコードを使用します。

DbDatabase.SetInitializer<MyDBContext>
   (new DropCreateDatabaseIfModelChanges<MyDBContext>());

しかし、それは機能していないようです。

モデルが変更され、新しく追加されたテーブルの1つを使用しようとしていますが、テーブルが見つからなかったと表示されます。

Invalid object name 'dbo.TableName'.

ただし、これを実行すると、機能しているように見え、テーブルが作成されています。

DbDatabase.SetInitializer<MyDBContext>(new DropCreateDatabaseAlways<MyDBContext>());

それは私のデータベースを更新します。

私が間違っているのは何ですか?

15
reinder

これは、マスターデータベースに対するユーザー権限であることが判明しました。 DropCreateDatabaseAlwaysを使用するのに、IfModelChangesのように、マスターデータベースに対するアクセス許可が必要ないのは奇妙なことです。

8
reinder

価値があるのは、ブラウザを閉じた後もカッシーニがまだ実行されていたため、DropCreate戦略の両方で多くの問題に遭遇しました。 (IIS Expressでも同じ問題が発生しました。)ローカルWebサーバーがまだ実行されていたため、Application_Startは再び起動しなかったので、そこに置いた初期化は実行されませんでした。

[編集して続行]を有効にして解決しました。

プロジェクトプロパティ> ウェブ> デバッガー> 編集と続行を有効にする

これにより、ブラウザが閉じたときにローカルWebサーバーが強制的に閉じられます。

10
Ryan Lundy

私は同じ問題を抱えていました:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<BreakAwayContext>());

私の場合、上記のコード行を追加したときにデータベースはすでに存在していました。データベースを削除してプログラムを再度実行すると、期待どおりに動作し始めました。データベースで「Enable-Migrations」を使用していたことが原因である可能性があるのは、他の競合だけでした。

HTH

4
Jeff Borden

この動作は、IncludeMetadataConventionを削除した場合に予想されます:modelBuilder.Conventions.Remove<System.Data.Entity.Database.IncludeMetadataConvention>();

1
Devart