web-dev-qa-db-ja.com

EF移行を新しいInitialCreateに統合する

私はしばらくの間EF移行を使用しており、プロジェクトに100を超える移行ファイルがあります。先に進む前に、これらを1つの移行に統合したいと思います。つまり、既存のInitialCreate移行を、その後のすべての変更を考慮した新しいバージョンに置き換えて、他のすべての移行ファイルを削除できるようにします。

DB内のすべてのデータを失うことを心配していなければ、これは非常に簡単に行えますが、私はそうしています。

Update-Databaseを実行するだけで、すべてのデータをそのまま維持し、データベースを最初から(データなしで)再作成する機能を維持しながら、これを実現するにはどうすればよいですか( Julie Lermanによって概説されたアプローチ )?

47
Paul Hiles

以下の手順には、DBで何もせずに作業できるという利点があり、__ MigrationHistoryはそのままの状態を維持できます。また、構造のバージョンが異なる複数の異なる環境がある場合にも機能します-一致するブランチがあれば。

最後の移行を最初の移行に変えます。秘訣は、使用中のコードとDBの最も古いバージョンを使用し、最後の移行を新しい初期移行に置き換え、以前のすべての移行を削除することです。新しいブランチは最新のマイグレーションを保持するので、古いブランチにマージした後も引き続き機能します。

したがって、最も古いブランチ(通常はPROD)から開始し、次のようにします。

  1. 最後の移行を除くすべてを削除します
  2. 前回の移行で「アップ」と「ダウン」の両方の方法で移行コードを削除します
  3. 最後の移行のビルドアクションを「なし」に変更して、EFがそれを無視できるようにします
  4. ローカルDBデータベースを指すようにアクティブな接続を変更します。
  5. このローカルDBデータベースが存在しないことを確認してください
  6. add-migration Initial
  7. 作成された「最初の」移行から最後の移行へのアップコードとダウンコードのコピー
  8. 初期移行を削除
  9. 最後の移行のビルドアクションを「コンパイル」に戻します
  10. チェックイン
  11. 変更をマージ
  12. LocalDB DBのDEVブランチでテスト-新しい初期移行と後続の移行を問題なく実行する必要があります
  13. 最新のDBのメインブランチでテストします-何もすべきではありません

上記の注意は、EFがそれ自体で実行しないものを移行に追加しない場合にのみ機能します。例えば。新しく作成された移行では取得されないDBビューなどを追加すると、EFがコードに基づいて生成したスクリプトのみが取得されます。

2
André Kops