私は、設計者がすべてのテーブルを IsHistorical ビット列でマークすることを決定したデータベースで作業しています。適切なモデル化の考慮がなく、スキーマを変更する方法がありません。
これは、ナビゲーション プロパティとやり取りする CRUD 画面を開発する際に摩擦を引き起こしています。単純に Product を取得してその EntityCollection を編集することはできません。手動で IsHistorical チェックをあちこちに書かなければならず、気が狂いそうになります。
これまでのところ、追加が論理的に削除されているかどうかを確認するすべての手動チェックを作成したため、重複するエンティティを追加する代わりに、IsHistoric を切り替えることができるため、追加も恐ろしいものです。
私が検討した3つのオプションは次のとおりです。
t4 テンプレートを変更して、IsHistorical チェックと同期を含めます。
ObjectContext で削除と追加をインターセプトし、IsHistorical 列を切り替えてから、オブジェクトの状態を同期します。
AssociationChanged イベントをサブスクライブし、そこで IsHistorical 列を切り替えます。
誰もこれを経験したことがありますか、または最も痛みのないアプローチを推奨できますか?
注:はい、わかっています。これは悪いモデリングです。あなたが持っている論理的な削除に関する同じ記事を読みました。この要件に対処しなければならないのは面倒ですが、対処します。データベース内のすべてのナビゲーション プロパティに対して同じコードを記述せずに、論理的な削除を処理する最も簡単な方法が欲しいだけです。
注#2 LukeLedの答えは技術的には正しいですが、あなたを本当に悪い貧乏人のORM、グラフのないパターンに強制します。問題は、「削除された」オブジェクトをすべてグラフから取り出し、それぞれに対して Delete メソッドを呼び出す必要があるという事実にあります。それは、手動の儀式的なコーディングをそれほど節約するつもりはありません。手動の IsHistoric チェックを記述する代わりに、削除されたオブジェクトを収集してそれらをループ処理しています。