2012-04-20 10 views
18

私はEntity Framework Code Firstを使用してプロジェクトを開始しました。準備ができたら、データベースとコードをホストプロバイダにアップロードしました。すべてが働いた。MVC3とコードの最初のマイグレーション - 「データベースが作成されてからコンテキストをバックアップするモデルが変更されました」

私のクラスの1つに新しいフィールドを追加する必要があり、データベース内のデータを失いたくないです。したがって、私はCode First Migrationsの使用に関するいくつかのブログ記事に従ってみました。私は次のようにしました:

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

私は、次のエラーメッセージが表示されますサイトを参照してください:データベースが作成されてから は「blahblah」コンテキストをバックアップモデルが変更されました。コードの最初の移行を使用してデータベースを更新することを検討してください。

私は間違っていますか?

答えて

23

私の経験からは、マイグレーションテーブルが同期していないことが示唆されています(データがそうでない場合でも)、それは今やdbスキーマの一部です。

問題の一部は、手動/バックアップコードを使用して、データベース全体を復元するいくつかの組み合わせで一緒に変更...多くの理由とそのエラーを体験する方法が、ほとんどの時間があるかもしれません - 私はなぜ常にそうであるかについて完全には確信していません。

要するに、Db-sが同じマイグレーションテーブルのデータであってもハッシュ比較が失敗する可能性があります(完全なリストアサウンドは十分ですが、「両面」を持っています)。手動でターゲット・サーバー・データベース上でSQLスクリプトとして適用することができます


何私の作品は「移行差」でスクリプトを作成します
Update-Database -Script

を使用することで、
(と挿入された適切な移行テーブルの行などを取得する必要があります)。

まだ動作しない場合は、引き続き2つのことができます。

  1. 移行テーブル(ターゲット - システム・テーブルの下を) - 取り外しバック以前の動作に失敗すると、あなたのDB-sが同じであることを特定している場合必要があります - - そこにhttp://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-automatic-migrations-walkthrough.aspxコメントどおりそれだけです私が使用した最後の手段として、「あなたを信頼」に

  2. を行く - 、
    INSERT INTO [__MigrationHistory]レコードを見つける(「フルスクリプト」を強制する必要があり、空のDBを初期化することにより)完全なスキーマのUpdate-Database -Scriptを行い、
    これを実行してデータベースに挿入します。
    物事が再び同期して実行させる必要があり、コードが一致し、

からと、データベースことを確認してください。

(免責事項:これはすべての回で動作するように証明弾丸ではありません、あなたは地元のシナリオ与えられたいくつかのことを試してみる必要があるかもしれない - しかし、同期であなたを取得する必要があります)

+1

「アップデート - データベース-script」を働きました。私は、 'Update-Database'コマンドが同じことをしていると思っていたでしょう(しかし、スクリプトを生成することはありません)。とにかく。ありがとう! –

+1

@ScottDietrich - np - これはすべきですが、すべての面で同期をとっておく必要があります(たとえば、マイグレーションはローカルDBのステータスなどに基づいて生成されます) db vs code - 「物を動かす」ことを始めたら、あなたは何か間違ったことが起こる可能性がより高い)。 SQLスクリプトはより安全な方法であることが判明しました。サーバー上にdevのセットアップをしていない限り、正確に見ることができます(マイグレーションを実行できるようにするため) – NSGaga

+0

私は、 __MigrationHistoryテーブルのレコードは、同じマイグレーションが再び実行されることを阻止しませんでした。私は__MigrationHistoryテーブルのすべての行を削除し、-Scriptコマンドで手動で生成されたINSERT INTO [__MigrationHistory]行を挿入することになりました。移行履歴が再び整理されました。非常に有益な答え@ NSGagaありがとう! –

関連する問題