migrations について
Entity Framework Core のマイグレーション開発向けスキルです。生成と適用の流れ、スナップショット互換性、回帰テストの指針を扱います。
主な機能
- 01マイグレーションの生成と適用
- 02スナップショットの互換性と正規化
- 03リレーショナルモデルの差分分析
- 04マイグレーション回帰テストの指針
活用シーン
- 01予期しないマイグレーション操作の調査
- 02旧モデルスナップショットとの互換性テスト
- 03対象を絞ったマイグレーション回帰テストの追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dotnet/ efcore --skill migrationsインストール後、Claude Code で/migrationsを入力して読み込まれたか確認します。
詳細
マイグレーション
パイプライン
マイグレーションの追加:MigrationsScaffolder.ScaffoldMigration() → MigrationsModelDiffer.GetDifferences() → MigrationOperation のリスト → CSharpMigrationsGenerator と CSharpSnapshotGenerator が Up/Down/Snapshot コードを生成します
マイグレーションの適用:Migrator.MigrateAsync() → __EFMigrationsHistory を読み込みます → 保留中の各マイグレーションについて:MigrationsSqlGenerator.Generate(operations) → MigrationCommandExecutor が実行します
モデルスナップショット
- モデルスナップショットでは、実際の CLR 型ではなく、プロパティバッグ形式の
typeof(Dictionary<string, object>)を使用します。スナップショット内のClrTypeを調べる際は、実際のエンティティ型と一致すると想定しないでください。 SnapshotModelProcessor.Process()は、古いモデルスナップショットを下位互換性のために修正する目的で、設計時に使用されます。MigrationsModelDifferは、リレーショナルモデル間のプロバイダーに依存しない構造比較を使用して、必要なマイグレーション操作を判断します。
アップグレードのみを対象とするリグレッションでは、具象の旧 ModelSnapshot を作成し、そのモデルを SnapshotModelProcessor.Process(..., resetVersion: true) で処理してから、同等の現在の設計時モデルと MigrationsModelDiffer.GetDifferences() で比較します。旧スナップショットから出力されたプロパティバッグの CLR 型を保持し、そのバージョンに存在しなかったメタデータを明示的に構成する API は省略してください。結果として得られる操作リストが空の場合にのみ、リグレッションが解消されたと判断できます。
レガシーのスナップショットの正規化は、実行時のマイグレーション適用ではなく、SnapshotModelProcessor に含めてください。互換性分岐の対象は、影響を受けるスナップショットの形式を出力し得る正確なリリースバージョンに限定してください。機能が存在する以前のバージョンを、単に数値が古いという理由で含めてはいけません。必要なセッターを公開している場合は、具象メタデータ実装へのキャストではなく、変更可能なメタデータインターフェイスを優先してください。構成ソースがないことを、過去のスナップショットにメタデータが存在しないことの判定に使用しないでください。古いスナップショットでは、現在の既定値を使って値がすでに構成されている場合があります。意味が変更されたメタデータについては、スナップショットの製品バージョンを使用して古い不変条件に戻してください。ゲートで指定された各バージョン系列と、最初の影響を受けないバージョンについて、焦点を絞ったテストを追加してください。
テスト
マイグレーション操作のテスト:test/EFCore.Relational.Tests/Migrations/。機能テスト:test/EFCore.{Provider}.FunctionalTests/Migrations/。モデル差分のテスト:test/EFCore.Relational.Tests/Migrations/Internal/MigrationsModelDifferTest*.cs。
スナップショットモデルをシミュレートするには、規約を使用せずに ModelBuilder の呼び出しを使用します。