使用Fluent NHibernate过滤软删除的数据

时间:2013-07-04 15:50:41

标签: nhibernate filter fluent-nhibernate soft-delete

我正在尝试使用Fluent NHibernate在我的应用程序中实现简单的软删除。所有实体都有一个布尔标志IsDeleted,删除操作只将此属性设置为true。 我正在努力查询相互引用的更复杂的实体,例如通过多对多的关系。假设我有Person个实体,收集了Project s:

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的实体”,这适用于所有查询和延迟加载的集合。

我尝试过:

  • 覆盖事件,但我无法拦截所有数据库读取并过滤所有已读取的实体。
  • 过滤器,我无法使用延迟加载的集合。

您会推荐什么,在没有代码重复的情况下实现软删除的最简单方法是什么,并且可以轻松地从表示层中分离出来?

1 个答案:

答案 0 :(得分: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>
 {
    ...
 }