C# 使用fluent nhibernate和额外的延迟加载进行软删除

C# 使用fluent nhibernate和额外的延迟加载进行软删除,c#,nhibernate,fluent-nhibernate,soft-delete,C#,Nhibernate,Fluent Nhibernate,Soft Delete,重写DefaultDeleteEventListener和DefaultLoadEventListener为使用Nhibernate实现软删除提供了一个非常好的解决方案 public class SoftDeletableLoadEventListener : DefaultLoadEventListener { #region Non-public members protected override object DoLoad(LoadEvent

重写DefaultDeleteEventListener和DefaultLoadEventListener为使用Nhibernate实现软删除提供了一个非常好的解决方案

 public class SoftDeletableLoadEventListener : DefaultLoadEventListener
    {
        #region Non-public members

        protected override object DoLoad(LoadEvent @event,
            IEntityPersister persister, EntityKey keyToLoad,
            LoadType options)
        {
            object entity = base.DoLoad(@event, persister, keyToLoad, options);

            var softEntity = entity as ISoftDeletable;

            if (softEntity != null && softEntity.IsDeleted)
            {
                if (options == LoadEventListener.ImmediateLoad
                    || options == LoadEventListener.Load)
                {
                    string msg =
                        string.Format("Can not Load soft deleted entity typeof({0}) with Id {1} as it was deleted.",
                            softEntity.GetType().Name,
                            softEntity.Id);

                    throw new InvalidOperationException(msg);
                }
            }

            return entity;
        }

        #endregion
    }
正如DefaultLoadEventListener的摘要所述: 定义NHibernate用于加载实体以响应生成的加载事件的默认加载事件侦听器


这意味着在进行额外加载时,不会应用过滤器,这会导致删除的实体被计数。在查询期间是否有其他方法应用软可删除筛选器?有没有更好的方法,然后总是手动过滤添加限制?

我已经用nh实现了软删除,而没有覆盖DefaultLoadEventListener,但我认为我的集合加载策略也可以帮助您。您可以向集合中添加where子句规范:

流利的NHibernate

.Override<Parent>(map =>
{
    map.HasMany<Child>(p => p.Children)
        .Where("IsDeleted = 0");
})
.Override(映射=>
{
map.HasMany(p=>p.Children)
。其中(“IsDeleted=0”);
})
HBM.xml

<bag name="Children" where="IsDeleted = 0">
  <key>
    <column name="ParentID" />
  </key>
  <one-to-many class="Child" />
</bag>

编辑
刚刚从nhibernate.info中找到关于软删除的内容,该内容建议使用覆盖的DefaultLoadEventListener,并使用where子句规范过滤选择项。

谢谢,这是一个很好的观点,但我还是想通过“更通用”找到一个更通用的解决方案,我想您希望在1个位置进行修改,而不是用where子句规范来表示每个集合?是的,这将是最整洁的方式。我认为,有一个代码约定总是在集合的映射中添加Where()子句有点麻烦。另一个缺点是,如果一个人从上面离开SoftDeletableLoadEventListener实现,他会有两个子句声明相同的内容。如果删除SoftDeletableLoadEventListener,则所有repo方法都应在必要时包含IsDeleted条件。即使整个域可以被软删除也有问题