2013-01-07 24 views
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時,不會應用過濾器,導致例如:刪除的實體正在計數。在查詢過程中是否有另一種方法來應用軟刪除過濾器?有沒有更好的方法,然後總是手動過濾添加限制?

回答

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> 

編輯 剛剛發現這個link有關從軟刪除建議使用重寫的DefaultLoadEvent的nhibernate.info監聽器並使用where子句規範篩選選擇。

+0

謝謝你,這是一個很好的觀點,但我想找到一個更通用的解決方案 –

+0

通過「更通用」,我想你希望在1個地方進行修改,而不是用每個集合表示where子句規範? –

+0

是的,那將是最好的方式。我認爲有一個代碼約定總是添加一個Where()子句來映射集合有點麻煩 –