3

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

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

class Project : Entity {
    //some properties
}

现在想象Personp 有Projects proj1 和 proj2。如果 proj1 被软删除,我们只需将其IsDeleted属性设置为 true。但是,当我访问 p 的项目时,collection 也会自动延迟加载 proj1,与它的标志无关。当然,我总是可以过滤集合,例如按Projects.Where(x => !x.Isdeleted),但这会导致重复代码容易出现错误。我想将这种数据杂耍从我的表示层中分离出来。

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

我试过的:

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

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

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 回答