web-dev-qa-db-ja.com

EFデータの移行は、新しい移行を追加するときに変更を検出しません

Entity Framework 5.0のデータ移行とコードを最初に使用しています。モデルに新しいフィールドを追加し、パッケージマネージャーコンソールで次のコマンドを実行すると。

 "Add-migration AddedField"

私が得るのは、「n_AddedField」と呼ばれる空の移行だけです。upメソッドとdownメソッドにはロジックが含まれていません。

EF nugetパッケージの再インストール、ソリューションのクリーニング、再構築、生成されたすべてのファイルとディレクトリの手動削除を試みました。

その後、すべての移行を破棄して最初からやり直すことにしましたが、それが奇妙になりました。すべての移行とデータベース内のmigrationhistoryテーブルを削除した後、CreateDatabaseIfNotExistsイニシャライザーを使用してデータベースを再作成しました。これを行った後、新しい初期移行を作成できるはずです。しかし、新しい移行を作成しようとすると、保留中の移行があるというエラーが表示され、プロジェクトから削除したばかりのすべての移行が一覧表示されます。

EFがこれらの移行の思い出をまだ持っている理由と方法がわかりません。移行がどこか他の場所に保存されているかどうかを確認するために、ファイルコンテンツを検索することさえしました。しかし、何も..

Scott hanslemanデモがステージ上でデモを行うと、データの移行は非常にきれいに見えますが、実際の作業のために、代替手段を探し始めています。

プロジェクトが開始されたとき、EF 4.xを使用し、しばらく前に5.0に切り替えましたが、切り替え以来、多くの移行を正常に追加しました。

この問題を解決する方法はありますか?基本的には、移行を追加し、変更を含むSQLスクリプトを生成できるようにしたいだけです。

35
Moulde

新しい移行が見つからないという同様の問題が発生したため、update-databaseで何をしても次のエラーが表示されました。

Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration.
You can use the Add-Migration command to write the pending model changes to a code-based migration.

「バッチクリーン」を実行することで問題が解決し、EFが現在選択されている「ソリューション構成(例:デバッグ)」以外のフォルダーの古い/無効なアセンブリを使用していることが示唆されました。

バッチクリーンを実行するには:

  1. Main Menu -> Build -> Batch Build...を選択します
  2. Select Allをクリックします
  3. Cleanをクリックします

ダイアログを閉じ、再構築して移行を再試行します。

これが他の誰かに役立つことを願っています。

35
Shaun Wilson

おっとっと。私の場合、他のエンティティによって参照されていない新しいルートエンティティを追加していました。結果は、コードには最初にエンティティの移行を生成する理由がなかったということです。 DbContext(dbset)にコードを追加すると、チャームのように機能しました。

23
naskew

同じ問題が発生しましたが、新しいフィールドがプロパティではなくメンバー変数として追加されたことがわかりました-{get; set;}部分を使用すると、移行でそのフィールドがスキップされます。

あなたの場合ではないかもしれませんが、それは他の誰かを助けるかもしれません。

10
Michel Marchand

Db、移行、コード-「同期がとれていない」ので、そのようなあらゆる種類の問題が予想されます。

これは私がしました million times(ほぼ:)そして、それは本当にうまく機能します-しかし、あなたは着実に行き、あなたがしていることに細心の注意を払う必要があります。

私が作ったこの「要約」を読むことができます-途中から始めてください(接続も確認してください)。

最初にテーブルを作成するコード

...そしてそれがうまくいかない場合は、小さな「繰り返し可能な」シナリオ/モデルを作成することをお勧めします-あなたが持っているものを正確に投稿してください。

移行の仕組み:

移行は「移行テーブル」に関連付けられています。

いつ Add-Migrationが実行されます-「既存のデータベース」構造と移行テーブルに対してチェックし、「差異」を作成します(単に同期化されているだけで「アップ」「ダウン」しない場合もあります)。

そのため、各「移行」は、コード、既存の移行、データベース、移行テーブルの複雑な相違点です。データベースを削除する以外にリセットするものは何もありません-Db「移行」テーブルでは十分ではないかもしれません-それは完全な「クリーンアップ」を保証しません(可能であれば、私は常に完全なDb削除を行います)。また、コードの移行を削除する必要があります。

関連する場所の前後で、プロジェクトを必ず「コンパイル」してください(構成で自動的にコンパイルするのが最適です)。

「接続」が一致することを確認してください。

すべてが同期したら、すべてがうまく機能するはずですが、同期を維持する必要があります。 Db(テスト)を削除する予定がない限り、そのような移行を削除しないでください(Update-Database -0(私は思う)移行に戻る(これは「ゼロ状態」です)。

7
NSGaga

これに似た問題がありました。-forceフラグadd-migration既存の移行を再スキャフォールドすることは、明確な理由なしに動作を停止しました。

何をしても、「次の明示的な移行が保留中のため、明示的な移行を生成できません」という愚かなエラーメッセージが表示されました。思いつく限りのことをすべて試した後、必死になってラップトップをバラバラに砕くのをやめて停止しましたenable-migrations再度、もちろん「プロジェクト 'Blah.Blah'ですでに移行が有効になっています」というメッセージが表示されます。 add-migration -force再び、魔法のように機能していました。

何が変わったのかわかりません。ソース管理外のユーザー設定/構成ファイルでした。これが他の人の助けになることを願っています。

6
joelmdev

バッチビルド->クリーンオプションは機能しませんでした。

私は次の方法で問題を解決しました:

  1. 「Add-Migration NameOfMigration」を使用して移行を作成する
  2. 作成された移行クラスのupおよびdown関数の内容を削除します。
  3. 移行スクリプトを実行してデータベースを更新します( 'Update-Database -Verbose'で_MigrationHistoryテーブルに行を追加するだけです)

Webアプリケーションが正常に実行されるようになったため、本質的にはメタデータのみを追加することで修正された問題がありました。

4
Ryan Spears

私の場合の問題の原因は次のとおりです。

  1. 移行を作成する(正常に)
  2. 再作成することを決定し、移行.csファイルを削除します
  3. それを再生成して、空の移行のDownおよびUp関数で終わるようにしてください

この場合、モデル変更のApplicationDbContextModelSnapshot.csエントリも削除するのを忘れました。このファイルの新しいマッピングを削除することで問題が解決し、正しく生成されました。

3

サブクラスのデータモデルに新しいクラスを追加しました。結果のネームスペースは、add-migrationを使用してscaffoldに表示されませんでした。

修正は、モデルの残りの部分に適合するように新しいクラスの名前空間の名前を変更するか、エンティティコンテキストクラスに「public virtual DbSet ..」などを追加することでした。この場合、この新しい名前空間を参照し、add-再び移行。

0
Robert Dyball

Publicアクセス修飾子を含めることを忘れないでください:

public string Text { get; set; }
0

EFによって生成された_MigrationHistoryテーブルを削除する必要がありました。次に、追加移行を再度実行しました。ただし、既に存在するテーブルを含め、最初から必要なクエリを生成するため、これには注意してください。

0
aoakeson

モデルとコンテキストクラスを別のプロジェクトに移動することで問題を解決できたようです。

私はまだこれが起こった理由がわかりません、そしてこの解決策は本当にまったく解決策ではありません:(

0
Moulde

たぶんすべての中で最も愚かな:

作成中の新しいオブジェクトとして同じ名前を使用して移行を追加していました。

0
RazvanR

同じ問題がありました。移行は有効でしたが、変更を検出していませんでした。私の解決策は、-Force属性を使用して移行を再度有効にし、すべてが機能するようにすることでした。

Enable-Migrations -ProjectName -StartupProjectName --ConnectionStringName -Force

0
kidra.pazzo

私の場合、ASP.net IDスタッフの一部としてセカンダリコンテキスト「ApplicationDbContext」を追加したためです。 「enable-migrations」コマンドを再度実行すると、複数のコンテキストがあるというエラーが表示されました。 2つを組み合わせると、再び機能し始めました。

0
Joshua Morgan