追跡とは
- EFはエンティティオブジェクトのプロパティ値の変更を追跡している!
- 変更のあったプロパティを効率的にUPDATEしてくれる!
- DbContext#SaveChanges系のメソッド実行時に最適化されたSQLが発行される
どうやったら追跡状態になるか
- DbContextクラスが管理する
- SELECT:デフォルトで追跡
- DbContext#Attachに渡す
追跡状態のエンティティのSELECT
- SELECTの条件が、DbContextが追跡しているエンティティに合致したら、そのオブジェクトを返す
- 実際のSQL文発行が節約される
追跡状態のチェック
- 追跡が都合が悪いケースがある
- 確実にDB内のデータが欲しい
- メモリを節約したい:単にSELECTしたデータを返すだけ
- DbContextクラスを通して調べられる
- 追跡されているかどうか
- プロパティに変更があったかどうか
- INSERT待ち/UPDATE待ち/DELETE待ち
追跡状態との付き合い方
- うまく使えば「作成日」「更新日」などを自動セットすることが可能
- 追跡状態のエンティティをメソッドの外に出さないのが吉
- プロパティを変更しただけなのにSQLが発行されてしまう!
- 追跡不要な場合に NoTracking を使う
最後に
- 追跡は知っておかないと確実にはまる
- 仕組みを確実に知っておこう!
- グローバルに「デフォルト追跡しない」にするのもアリかも!