2015-04-20 43 views
3

我對審計有非常明確的需求。NHibernate Envers:基於屬性值的審計實體

考慮下面的類(我改變了我的課的名稱和修剪簡單起見不必要的代碼)

[Audited] 
public class Client 
{ 
    [NotAudited] 
    public virtual IList<Order> Orders {get; set;} 
} 

當訂單屬性不爲空的用戶實體應該只審覈。

這是否可能?如果是這樣,我該怎麼做?

回答

3

如果您想基於某種狀態關閉運行時的審計,則可以創建自己的自定義子類AuditEventListener,並將該類型的實例傳遞給IntegrateWithEnvers方法。

在你的子類,可以覆蓋OnPostDeleteOnPostInsertOnPostRecreateCollectionOnPostUpdateOnPreRemoveCollectionOnPreUpdateCollection。在你的情況下,你應該檢查evt.Entityevt.AffectedOwnerOrNull。如果你想審計,只需調用base方法,如果你不想審計,在你的實現中什麼也不做。

但是請注意,如果您只是使用Envers進行簡單日誌記錄,那麼您應該只是這樣做。如果您使用它來重新創建歷史實例,則在加載歷史實例時,「刪除」某些歷史事件的審計可能會導致問題。如果您遇到這種情況,只要一個實體在其整個生命週期中有或沒有得到Orders,就可以這麼做。

+0

感謝您的回覆。你的答案的第一部分很好,最後一段不是很多:)我需要在某些時候顯示歷史記錄。所以最好記錄一切,我會過濾出歷史記錄。 – Sam