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?
}
這是在觸發器數據庫中更容易完成的事情。這不是你的選擇嗎? –
您可以從@event獲取會話對象。你可以保存你的新對象嗎? –
@DanielHilgarth我實際上首先創建了一個基於觸發器的解決方案,但我們寧願將它保留在c#代碼中。當所有其他代碼都在C#代碼中時,觸發器解決方案將非常「隱藏」開發人員。這也會造成一些問題,因爲我們需要發送adminId數據庫不知道的信息,因此可以將它插入到審計表中。 – viblo