Fluent NHibernate を使用して、アプリケーションに単純なソフト削除を実装しようとしています。すべてのエンティティにはブール フラグIsDeleted
があり、削除操作ではこのプロパティのみが true に設定されます。たとえば、多対多の関係を持つなど、相互に参照するより複雑なエンティティのクエリに苦労しています。Person
のコレクションを持つエンティティがあるとしましょうProject
:
class Person : Entity {
public virtual IList<Project> Projects { get; set; }
}
class Project : Entity {
//some properties
}
Person
p にProject
proj1 と proj2があるとします。proj1 が論理的に削除された場合、そのIsDeleted
プロパティを true に設定するだけです。ただし、p のプロジェクトにアクセスすると、そのフラグとは関係なく、コレクションも proj1 で自動的に遅延ロードされます。もちろん、たとえば でコレクションをいつでもフィルタリングできますProjects.Where(x => !x.Isdeleted)
が、これはコードの繰り返しにつながり、バグが発生しやすくなります。この種のデータ ジャグリングをプレゼンテーション レイヤーから分離したいと考えています。
IsDeleted
すべてのクエリと遅延ロードされたコレクションに適用される、「falseに設定されたエンティティのみをロードする」というグローバル ルールによって、このプロセスを自動化したいと考えています。
私が試したこと:
- イベントをオーバーライドしますが、すべての DB 読み取りを傍受し、読み取られたすべてのエンティティをフィルター処理することはできませんでした。
- 遅延ロードされたコレクションを処理できなかったフィルター。
コードを繰り返さずにソフトデリートを実装し、プレゼンテーションレイヤーから簡単に分離できる最も簡単な方法は何ですか?