重写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用于加载实体的默认加载事件侦听器,以响应生成的加载事件。
这意味着在执行ExtraLazyLoading时,不应用过滤器,这会导致例如:已删除的实体被计数。在查询期间是否有另一种方法可以应用软删除过滤器?是否有更好的方法,然后总是手动过滤添加限制?
答案 0 :(得分:2)
我已经使用nh实现了软删除而没有覆盖DefaultLoadEventListener,但我认为我的集合加载策略也可以帮助你。您可以在集合中添加where子句规范:
流利的NHibernate
.Override<Parent>(map =>
{
map.HasMany<Child>(p => p.Children)
.Where("IsDeleted = 0");
})
<强>的hbm.xml 强>
<bag name="Children" where="IsDeleted = 0">
<key>
<column name="ParentID" />
</key>
<one-to-many class="Child" />
</bag>
修改的 刚刚从nhibernate.info找到关于软删除的link,它建议使用重写的DefaultLoadEventListener并使用where子句规范过滤选择。