update-pipeline について
Entity Framework Core の更新パイプライン開発向けスキルです。追跡されたエンティティ変更からデータベースコマンドへの変換を扱い、順序付け、バッチ処理、同時実行チェック、検証を説明します。
主な機能
- 01変更検出とコマンド準備
- 02外部キー依存関係の順序付け
- 03SQL 生成とコマンドのバッチ処理
- 04同時実行トークンのチェック
- 05ストア生成値の検証
活用シーン
- 01SaveChanges のコマンド実行の追跡
- 02外部キー順序とバッチ処理のテスト
- 03古いデータへの書き込み時の同時実行エラー検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dotnet/ efcore --skill update-pipelineインストール後、Claude Code で/update-pipelineを入力して読み込まれたか確認します。
詳細
更新パイプライン
追跡対象のエンティティ変更を、SaveChanges() の実行中にデータベースの INSERT/UPDATE/DELETE コマンドへ変換します。
フロー
SaveChanges() → DetectChanges() → IDatabase.SaveChanges() → UpdateAdapter が IUpdateEntry のリストを作成 → CommandBatchPreparer.BatchCommands()
→ テーブルの各行について ModificationCommand を作成し、列ごとの ColumnModification で構成
→ 同じ行にマッピングされたエントリの追跡に SharedTableEntryMap を使用
→ Multigraph によるトポロジカルソート(FK 依存関係の順序付け)
→ ModificationCommandBatch にグループ化(最大バッチサイズを遵守)
→ UpdateSqlGenerator がバッチごとに SQL を生成 → BatchExecutor がトランザクション内ですべてのバッチを実行 → StateManager.AcceptAllChanges()
同時実行制御
同時実行トークン → UPDATE/DELETE の WHERE 条件。AffectedCountModificationCommandBatch が影響を受けた行数を確認します。一致しない場合は DbUpdateConcurrencyException をスローします。
共有行の値へのアクセス
コマンドの状態が示すのは行に対する操作であり、すべてのエントリの状態ではありません。削除済みの SharedIdentityEntry を持つ追加エントリは、Modified コマンドに含まれる場合があります。元の値へのアクセスでは、削除済みの共有エントリの元の値を使用し、依存関係の順序付けに必要な以前の FK を維持する必要があります。
検証
SaveChanges()が期待される影響行数を返す- INSERT/UPDATE の後、ストア生成値がエンティティに反映される
- 古いデータに対して、想定どおり
DbUpdateConcurrencyExceptionがスローされる