web-dev-qa-db-ja.com

MVC3とコードファーストの移行-「データベースが作成されてから、「何とか」のコンテキストを支えるモデルが変更されました」

Entity Framework Code Firstを使用してプロジェクトを開始しました。準備ができたら、データベースとコードをホストプロバイダーにアップロードしました。すべてがうまくいった。

クラスの1つに新しいフィールドを追加する必要があり、データベースのデータを失いたくありません。そのため、Code First Migrationsの使用に関するブログ投稿をいくつか試してみました。私は次のことをしました:

  1. リモート(運用)データベースをバックアップしました。
  2. このデータベースをローカルに接続しました
  3. プロパティをクラスに追加しました
  4. PM>移行の有効化
  5. PM> Add-Migration AddSortOrderToCar
  6. PM>データベースの更新
  7. この時点で、ローカルデータベースの.bakファイルを作成し、そのファイルを使用してリモートデータベースに「復元」しました。
  8. 最後に、コードをリモートサイトに公開しました。

サイトにアクセスすると、次のエラーメッセージが表示されます。 'blahblah'コンテキストをサポートするモデルは、データベースが作成されてから変更されています。 Code First Migrationsを使用してデータベースを更新することを検討してください。

何が悪いのですか?

21
Scott Dietrich

移行テーブルが同期されていないことを示唆する私の経験から(データが同期されていない場合でも)、それは現在、dbスキーマの一部になっています(4.3以降、システムテーブルの下)。

そのエラーが発生する理由と方法はたくさんありますが、ほとんどの場合...

問題のある部分は、データベース全体を手動でバックアップ/復元することと、コードを変更することの組み合わせです-なぜ常にそうであるかは完全にはわかりません。

つまり、Db-sが同じであっても、移行テーブルのデータは同じではない可能性があり、ハッシュ比較が失敗する可能性があります(それでも完全な復元は十分に聞こえますが、「両側」があります)。


私にとってうまくいくのは使用することです
Update-Database -Script

これにより、「移行の違い」を持つスクリプトが作成されます。
ターゲットサーバーデータベースにSQLスクリプトとして手動で適用できます(適切な移行テーブルの行が挿入されるはずです)。

それでもうまくいかない場合は、次の2つのことを行うことができます...

  1. 移行テーブルを削除します(ターゲット-システムテーブルの下)-に従って http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-automatic-migrations- walkthrough.aspx コメントがそこにあります-以前の動作にフェールバックする必要があり、Db-sが同じであることを確信している場合は、「信頼する」だけです。

  2. 私が使用した最後の手段として、Update-Database -Script完全なスキーマの(たとえば、「完全なスクリプト」を強制する空のdbを初期化することにより)、
    を見つける INSERT INTO [__MigrationHistory] 記録、
    それらを実行し、データベースに挿入するだけです。
    そしてあなたのデータベースとコードが一致していることを確認してください、

これで物事は再び同期するはずです。

(免責事項:これは常に機能するための完全な証拠ではありません。ローカルのシナリオを考えると、いくつかのことを試す必要があるかもしれませんが、同期する必要があります)

ステップ6では、Update-Database -Verboseを実行する必要があると思います。

また、このリンクは、EFでScaffoldingを使用してデータベースを更新する場合に非常に役立ちます http://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-entity-framework -scaffolding-and-migrations

0
srinced