1
覆蓋DefaultDeleteEventListener和DefaultLoadEventListener提供了一個非常好的解決方案,使用Nhibernate實現軟刪除。軟刪除使用流利的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時,不會應用過濾器,導致例如:刪除的實體正在計數。在查詢過程中是否有另一種方法來應用軟刪除過濾器?有沒有更好的方法,然後總是手動過濾添加限制?
謝謝你,這是一個很好的觀點,但我想找到一個更通用的解決方案 –
通過「更通用」,我想你希望在1個地方進行修改,而不是用每個集合表示where子句規範? –
是的,那將是最好的方式。我認爲有一個代碼約定總是添加一個Where()子句來映射集合有點麻煩 –