【问题标题】:Filtering soft-deleted data with Fluent NHibernate使用 Fluent NHibernate 过滤软删除的数据
【发布时间】: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 =&gt; !x.Isdeleted),但这会导致重复代码容易出现错误。我想将这种数据杂耍从我的表示层中分离出来。

我想通过一些全局规则自动执行此过程,即“仅加载 IsDeleted 设置为 false 的实体”,该规则适用于所有查询和延迟加载的集合。

我尝试过的:

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

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

【问题讨论】:

标签: nhibernate filter fluent-nhibernate soft-delete


【解决方案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>
 {
    ...
 }

【讨论】:

  • 谢谢,之前没注意这个方法。但是,这不允许我在显示/隐藏软删除数据之间动态切换。但是如果我不需要这样的功能(规范仍在开发中),这将很容易解决我的问题。不重要的旁注:在我使用的 Fluent NHibernate 的最后一个版本中,Where 方法只接受 SQL where 子句,而不接受 lambda。
  • 更新:我已经对其进行了测试,它在一个简单的测试项目中运行良好,但我无法让它在我的应用程序中运行。 where 方法似乎被完全忽略了,我可以将任何东西作为字符串参数(甚至是随机字符串)并且它仍然有效,从不将子句添加到 SQL 查询中。我正在使用自动映射(但在一个非常简单的测试应用程序中,它适用于自动映射和手动映射)。我对过滤器有类似的问题,它们根本没有被应用。知道可能出了什么问题吗?是什么阻止了此功能?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多