21

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

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

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

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

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

4

2 に答える 2

27

私の経験から、移行テーブルが同期していないことを示唆しており(データが同期していない場合でも)、それは現在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が同じであることが確実な場合は、「信頼する」だけです。

  2. 私が使用した最後の手段としてUpdate-Database -Script、完全なスキーマを作成し(たとえば、「完全なスクリプト」を強制する空のデータベースを初期化することによって)、レコードを
    見つけて 実行し、データベースに挿入して、データベース を確認します。 -とコードの一致、INSERT INTO [__MigrationHistory]

これにより、物事が再び同期して実行されるはずです。

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

于 2012-04-21T00:16:49.413 に答える
1

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

また、このリンクは、EFのデータベースをスキャフォールディングで更新するのに非常に役立ちます http://www.asp.net/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-entity-framework-scaffolding-and -移行

于 2016-02-01T17:34:17.833 に答える