【发布时间】:2013-07-04 15:50:40
【问题描述】:
我正在尝试使用 Fluent NHibernate 在我的应用程序中实现简单的软删除。所有实体都有一个布尔标志IsDeleted,删除操作只会将此属性设置为true。
我正在努力查询相互引用的更复杂的实体,例如通过多对多关系。假设我有Person 实体,拥有Projects 的集合:
class Person : Entity {
public virtual IList<Project> Projects { get; set; }
}
class Project : Entity {
//some properties
}
现在想象Person p 有Projects proj1 和 proj2。如果 proj1 被软删除,我们只需将其 IsDeleted 属性设置为 true。但是,当我访问 p 的项目时,collection 也会自动延迟加载 proj1,与它的标志无关。当然,我总是可以过滤集合,例如通过Projects.Where(x => !x.Isdeleted),但这会导致重复代码容易出现错误。我想将这种数据杂耍从我的表示层中分离出来。
我想通过一些全局规则自动执行此过程,即“仅加载 IsDeleted 设置为 false 的实体”,该规则适用于所有查询和延迟加载的集合。
我尝试过的:
- 覆盖事件,但我无法拦截所有数据库读取并过滤所有读取的实体。
- 过滤器,我无法使用延迟加载的集合。
您会推荐什么,实现软删除而不重复代码且易于与表示层分离的最简单方法是什么?
【问题讨论】:
-
您能否向我们展示项目映射,因为您可以直接在类 xml 级别进行过滤
-
另见此处了解如何操作。 puredotnetcoder.blogspot.co.uk/2012/04/…
标签: nhibernate filter fluent-nhibernate soft-delete