2013-07-04 88 views
3

我想在我的應用程序中使用Fluent NHibernate實現簡單的軟刪除。所有實體都有一個布爾標誌IsDeleted,而刪除操作只會將此屬性設置爲true。 我很努力地查詢更復雜的實體,例如通過多對多的關係來引用對方。比方說,我有Person實體,具有Project個集合:用Fluent NHibernate過濾軟刪除數據

class Person : Entity { 
    public virtual IList<Project> Projects { get; set; } 
} 

class Project : Entity { 
    //some properties 
} 

現在想象Person p具有Project小號proj1和proj2。如果proj1被軟刪除,我們只需將它的IsDeleted屬性設置爲true即可。但是,當我訪問p的項目時,集合會自動延遲加載proj1,與其標誌無關。當然,我總是可以過濾集合,例如Projects.Where(x => !x.Isdeleted),但這會導致重複代碼容易出現錯誤。我想從我的表現層中分離出這種數據。

我想通過一些全局規則自動化這個過程,說「只加載設置爲false的實體IsDeleted」,它適用於所有查詢和延遲加載的集合。

我曾嘗試:

  • 覆蓋事件,但我沒能攔截所有數據庫中讀取並篩選所讀取的所有實體。
  • 過濾器,我無法使用延遲加載的集合。

你會推薦什麼是最簡單的方式來實現軟刪除沒有代碼重複和容易分離的表示層?

+0

你能告訴我們的項目映射,你可以在類XML層次過濾器直接 – Rippo

+1

另請參見這裏怎麼看。 http://puredotnetcoder.blogspot.co.uk/2012/04/using-filters-for-unmapped-columns-in.html – Rippo

回答

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> 
{ 
    ... 
} 
+0

謝謝,我之前沒有注意到這種方法。但是,這不會讓我在顯示/隱藏軟刪除數據之間動態切換。但如果我不需要這樣的功能(規範仍在開發中),這將很容易解決我的問題。 不重要的一面注意:在我使用的流利NHibernate的最後一個版本中,Where方法只接受SQL where子句,而不是lambda。 – Aries512

+0

更新:我測試過它,它在一個簡單的測試項目中工作正常,但我無法在我的應用程序中使用它。凡方法似乎完全忽略,我可以把任何東西作爲一個字符串參數(即使是隨機字符串),它仍然工作,子句永遠不會被添加到SQL查詢。我使用automapping(但是在一個非常簡單的測試應用程序中,它可以同時用於自動映射和手動映射)。我有過濾器類似的問題,他們只是沒有應用。任何想法可能是錯的?什麼阻止了這個功能? – Aries512