2012-08-22 42 views
2

我們有一個網絡應用程序,我們使用NHibernate作爲ORM,現在我們需要在一些實體上添加審覈來跟蹤誰改變了什麼。然而,我還沒有設法找出處理它的最好和最簡單的方法。審覈日誌與nhibernate複製表

如果可能的話,我想審計信息去到一個單獨的表中的每個實體,像這樣的(僞SQL):

create table MethodStatus (MethodId, Enabled) 
create table MethodStatusAudit (MethodId, Enabled, AdminId, Date, ChangeType(U,D,I)) 

的問題是如何設置這個與(流利)NHibernate的這樣它有點容易管理?

我最初的想法是使用IPreInsertEventListener/IPreUpdateEventListener/IPreDeleteEventListener,並讓我的可審計對象實現IAuditable接口,然後執行一些操作。但我不知道如何保存審計..

public interface IAuditable {} 

public class MethodStatus : IAuditable 
{ 
    public virtual int MethodId { get; set; } 
    public virtual bool Enabled { get; set; } 
} 

public class MethodStatusMap : ClassMap<MethodStatus> 
{ 
    public MethodStatusMap() 
    { 
     Id(x => x.MethodId); 
     Map(x => x.Enabled); 
    } 
} 

public bool OnPreInsert(PreInsertEvent @event) 
{ 
    var e = @event.Entity as IAuditable; 
    if (e != null) 
     //save audit.. but how? 
} 
+0

這是在觸發器數據庫中更容易完成的事情。這不是你的選擇嗎? –

+0

您可以從@event獲取會話對象。你可以保存你的新對象嗎? –

+0

@DanielHilgarth我實際上首先創建了一個基於觸發器的解決方案,但我們寧願將它保留在c#代碼中。當所有其他代碼都在C#代碼中時,觸發器解決方案將非常「隱藏」開發人員。這也會造成一些問題,因爲我們需要發送adminId數據庫不知道的信息,因此可以將它插入到審計表中。 – viblo

回答