我正在尝试使用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的实体”,这适用于所有查询和延迟加载的集合。
我尝试过:
您会推荐什么,在没有代码重复的情况下实现软删除的最简单方法是什么,并且可以轻松地从表示层中分离出来?
答案 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>
{
...
}