19

プロジェクトで Entity Framework 5 を使用しており、移行が有効になっています。

シナリオは次のとおりです。

新しい開発者 (dev1) がやって来て、ソースからプロジェクトをビルドします。以前の開発者が過去にプロジェクトに取り組んでいたため、既存の移行があります。

その開発者が初めて ASP.NET MVC プロジェクトを実行すると、データベースが自動的に構築され、エラーは表示されません。

ただし、その後、別の開発者 (dev2) が新しい移行を追加します。Dev1 が を実行しようとすると、以前Update-Databaseのすべての移行が実行されます。しかし、それらはDev1 が見た初期モデルの一部であったため、既に適用されています。これは、既に存在するスキーマの変更を適用しようとしているため、スキーマ エラーが発生することがよくあります。

したがって、最適には、ローカル データベースを現在の移行に「早送り」するだけでよいでしょう。しかし、私はそれを行う方法を知りません。または、初期化中にすべての移行を適用できるように、データベースを初期化する他の方法はありますか?

4

3 に答える 3

25

私はハックを見つけました。

走るUpdate-Database -Script

すでに実行されているすべての移行を選択します

INSERT INTO [__MigrationHistory] ([MigrationId], [Model], [ProductVersion]) VALUES

Sql Server Management Studioを開き、それらのsqlステートメントを手動で実行します。

新しい移行は正常に機能するはずです。

于 2013-01-11T20:58:02.160 に答える
4

チーム環境での Entity Framework の移行は、注意が必要な場合があります。特にソース管理と組み合わせると。さまざまなコード ファーストの移行がさまざまな開発データベースに対して実行されているという問題が発生しているようです。

特定のデータベースに対して実行されたすべての移行は、__MigrationHistory テーブルに格納されます。プロジェクトに移行ファイルがあり、EF が __MigrationHistory テーブルにそれを認識しない場合、Update-Database の実行時にそれを実行しようとします。MigrationHistory にレコードを挿入して、これらの移行ファイルが既に適用されていると EF に思わせると、まず EF コードの最も優れた機能の 1 つが壊れます。update-database -TargetMigration を使用して移行を元に戻すことはできません。

各開発者に独自の移行セットがあり、変更が重複している可能性がある場合、update-database を実行すると、あらゆる種類の SQL エラーが発生する可能性があります。

これに対する私の解決策は、アクティブな開発に関係するすべての移行ファイルを無視することでした (それらは頻繁に調整される傾向があるため)。開発者が新しい変更セットを取得すると、独自のローカル マイグレーションを作成するだけです。

新しい機能を本番環境にリリースする準備ができたら、これらすべての変更を 1 つの大きな移行にまとめます。通常は、アプリをインクリメントするバージョン番号に基づいて名前を付けます。これらの移行ファイルをソース管理にチェックインします。これらは、新しいデータベースを本番環境で最新の状態にするためのマスター移行ファイルとして機能します。

これらのマスター移行の新しいものを作成すると、すべての開発者がローカルの変更を最後のメジャー バージョンに戻し、不要になったものを削除し (それらはマスター移行でカバーされているため)、update-database を実行します。

于 2013-01-11T21:04:56.267 に答える