3

Fluent NHibernate を使用して、アプリケーションに単純なソフト削除を実装しようとしています。すべてのエンティティにはブール フラグIsDeletedがあり、削除操作ではこのプロパティのみが true に設定されます。たとえば、多対多の関係を持つなど、相互に参照するより複雑なエンティティのクエリに苦労しています。Personのコレクションを持つエンティティがあるとしましょうProject:

class Person : Entity {
    public virtual IList<Project> Projects { get; set; }
}

class Project : Entity {
    //some properties
}

Personp にProjectproj1 と proj2があるとします。proj1 が論理的に削除された場合、そのIsDeletedプロパティを true に設定するだけです。ただし、p のプロジェクトにアクセスすると、そのフラグとは関係なく、コレクションも proj1 で自動的に遅延ロードされます。もちろん、たとえば でコレクションをいつでもフィルタリングできますProjects.Where(x => !x.Isdeleted)が、これはコードの繰り返しにつながり、バグが発生しやすくなります。この種のデータ ジャグリングをプレゼンテーション レイヤーから分離したいと考えています。

IsDeletedすべてのクエリと遅延ロードされたコレクションに適用される、「falseに設定されたエンティティのみをロードする」というグローバル ルールによって、このプロセスを自動化したいと考えています。

私が試したこと:

  • イベントをオーバーライドしますが、すべての DB 読み取りを傍受し、読み取られたすべてのエンティティをフィルター処理することはできませんでした。
  • 遅延ロードされたコレクションを処理できなかったフィルター。

コードを繰り返さずにソフトデリートを実装し、プレゼンテーションレイヤーから簡単に分離できる最も簡単な方法は何ですか?

4

1 に答える 1

1

私の頭の上から@Rippoを完了するには、次のようなものが機能するはずです:

public abstract class BaseEntity
{
  public bool IsDeleted {get;set;}
}

public class SomeEntity : BaseEntity
{
   ....
 }

public abstract class EntityMap<T>: ClassMap<T> where T:BaseEntity
{
     public EntityMap()
     {
       Where(x=>!x.IsDeleted);
     }
 }

 public class SomeEntityMap: EntityMap<SomeEntity>
 {
    ...
 }
于 2013-07-04T21:52:08.150 に答える