change-tracking について
EF Core の変更追跡内部を扱う開発スキルです。エンティティ状態、スナップショット、変更検出、ID マップを取り上げ、状態遷移やグラフ置換の実装とテストを支援します。
主な機能
- 01追跡エンティティと状態の管理
- 02スナップショット・通知による変更検出
- 03ID マップと共有 ID の置換
- 04コンパイル済みプロパティアクセサー
- 05単体テストとグラフ更新テストの指針
活用シーン
- 01予期しないエンティティ状態遷移の調査
- 02スナップショット方式の変更検出テスト
- 03共有 ID を持つ置換グラフの検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ dotnet/ efcore --skill change-trackingインストール後、Claude Code で/change-trackingを入力して読み込まれたか確認します。
詳細
変更追跡
エンティティの状態を管理し、SaveChanges() の変更を検出します。
コアコンポーネント
StateManager— 追跡中のエントリ、ID/参照マップ、関連付けの修正、連鎖処理、通知、変更数を管理しますInternalEntryBaseと派生クラス — エントリごとの状態、フラグ、値、スナップショット、順序付けられた状態遷移を管理しますChangeDetector— 現在の値とベースラインを比較し、エントリの変更 API を通じて変更を報告しますSnapshotFactoryFactoryのサブクラス — 元の値とリレーションシップ値の受動的なベースラインを作成しますIdentityMap— キーごとにアクティブなエントリを 1 つだけ許可します。共有 ID では、置き換え対象を以前のDeletedエントリと対応付けますPropertyAccessorsFactory、ClrPropertyGetterFactory、ClrPropertySetterFactoryは、効率的なスナップショット作成と変更検出のためにプロパティアクセサーをコンパイルしますindicesパラメーターの序数は、複合コレクションの各深さにおける要素を指定します
変更検出
- スナップショット方式と通知方式のどちらも
SetPropertyModified()を呼び出し、プロパティフラグとエンティティの状態の一貫性を保ちます。 SetEntityState()は値を検証し、フラグと複合エントリを更新して状態を変更した後、マネージャーの管理フックを実行します。
共有 ID の置き換え
SharedIdentityEntry は、同じ ID を持つ置き換え対象と、その置き換え先とを区別するための不変条件です。置き換え先のグラフをアタッチする際、削除済みの入れ子エントリを再検討するのは、そのソースエントリに置き換え先がある場合に限ります。削除済みのすべてのノードを対象にしてはいけません。同様に、置き換え前のプリンシパルからの連鎖処理によって、置き換え先のグラフに属する依存エントリが削除されないようにしてください。同期と非同期のグラフアタッチ処理は同等に保ち、置き換えテストでは無関係な値を保持して ID 遷移だけを検証できるようにしてください。
テスト
単体テスト:test/EFCore.Tests/ChangeTracking/。機能テスト:test/EFCore.Specification.Tests/GraphUpdates/。
よくある落とし穴
| 落とし穴 | 解決策 |
|---|---|
| 状態ベースのチェックでは、Added/Deleted のすべてのエントリが置き換え対象として扱われます | SharedIdentityEntry とグラフのソースを通じて置き換え処理の対象を限定します |
検証
DetectChanges()はスナップショット比較によって変更されたプロパティを特定します- 元の値を設定すると、現在の値との比較に基づいて、プロパティが変更済みまたは未変更に設定されます
コメント
Markdown 対応