用Fluent-NHibernate过滤软删除数据

用Fluent-NHibernate过滤软删除数据,nhibernate,filter,fluent-nhibernate,soft-delete,Nhibernate,Filter,Fluent Nhibernate,Soft Delete,我正在尝试使用Fluent NHibernate在我的应用程序中实现简单的软删除。所有实体都有一个布尔标志IsDeleted,删除操作仅将此属性设置为true。 我正在努力查询相互引用的更复杂的实体,例如通过多对多关系。假设我有Person实体,拥有项目的集合: class Person : Entity { public virtual IList<Project> Projects { get; set; } } class Project : Entity {

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

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

class Project : Entity {
    //some properties
}
类人:实体{
公共虚拟IList项目{get;set;}
}
类别项目:实体{
//一些性质
}
现在想象一下
Person
p拥有
Project
s proj1和proj2。如果proj1被软删除,我们只需将其
IsDeleted
属性设置为true。然而,当我访问p的项目时,集合也会自动延迟加载proj1,与它的标志无关。当然,我总是可以过滤集合,例如通过
项目进行过滤。其中(x=>!x.Isdeleted)
,但这会导致重复的代码容易出现错误。我想将这种数据处理与表示层分开

我想通过一些全局规则来自动化这个过程,即“只加载
IsDeleted
设置为false的实体”,这适用于所有查询和延迟加载的集合

我所尝试的:

  • 覆盖事件,但我无法截获所有DB读取并过滤所有读取的实体
  • 过滤器,我无法处理延迟加载的集合

您会推荐什么,实现无代码重复且易于与表示层分离的软删除的最简单方法是什么?

要完成@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>
 {
    ...
 }
公共抽象类BaseEntity
{
公共布尔被删除{get;set;}
}
公共类SomeEntity:BaseEntity
{
....
}
公共抽象类EntityMap:ClassMap,其中T:BaseEntity
{
公共实体映射()
{
式中(x=>!x.IsDeleted);
}
}
公共类SomeEntityMap:EntityMap
{
...
}

您能否向我们展示项目映射,因为您可以直接在类xml级别进行筛选。请参见此处了解如何进行筛选。谢谢,我以前没有注意到这个方法。但是,这不允许我在显示/隐藏软删除数据之间动态切换。但如果我不需要这样的特性(规范还在开发中),这将很容易解决我的问题。不重要的补充说明:在我使用的Fluent NHibernate的上一个版本中,Where方法只接受SQL Where子句,而不接受lambda。更新:我已经对它进行了测试,它在一个简单的测试项目中运行良好,但我无法使它在我的应用程序中运行。在方法似乎被完全忽略的地方,我可以把任何东西作为字符串参数(甚至是随机字符串),它仍然有效,子句从未添加到SQL查询中。我正在使用自动映射(但在一个非常简单的测试应用程序中,它可以同时使用自动映射和手动映射)。我对过滤器也有类似的问题,它们根本不适用。你知道怎么回事吗?什么是阻止此功能?