EFCoreでカスケード削除を扱う

神聖なデータベース

ちょっとハマったのでメモがてら。

EFCoreでカスケード削除を扱うには、ビルダーの構成が必要になります。

カスケード削除についてはこの辺の公式ドキュメントが詳しいです。

公式ドキュメントにもあるとおり、DeleteBehavior.ClientCascade を指定して、削除時のふるまいを規定してやる必要があります。裏を返すと、初期状態ではカスケード削除は行えないことになります。

まさにここにハマってしまった訳です。

普段は削除フラグを付けて回っておいて、半年ぐらい後に実際のデータ削除を行うバッチプログラムが実行される仕組みのシステムだったのですが、このバッチがカスケード削除ができないことによって外部キー制約で見事にコケて、トラブル対応をしました。

ちなみに、一気にカスケード削除のふるまいを後付けで行うのは怖いので、結局は削除バッチの方を工夫してキーの制約を受けないように順番に削除を行うように作りこんだのでした。