2009-10-02 40 views
3

在我的應用程序中,我有幾種不同類型的實體,我需要對其進行字段級更改跟蹤。我已經爲此搜索了,只能舉出簡單的「插入日期」和「更新日期」審計跟蹤的例子,您只需修改已被持久化的實體上的字段。我的要求是更復雜,因爲:如何在NHibernate中進行通用字段和組件級別更改跟蹤?

  1. 我需要建立代表變化不只是修改了實體領域的新的實體被保存(如插入日期,更新日期的例子,我發現)
  2. 我需要保存這些新的實體到數據庫在同一事務更新跟蹤實體
  3. 我需要跟蹤更改連接到被追蹤實體ValueObjects集合
  4. 我不希望有寫爲單獨的日誌代碼每一個跟蹤實體

示例代碼:

public interface ITrackChanges {} 
{ 
} 

public class Account : ITrackChanges 
{ 
    public int Id; 
    public string AccountNumber; 
    public string CustomerName; 
    public string CustomerAddress; 
} 

public class Computer : ITrackChanges 
{ 
    public int Id; 
    public string AssetTag; 
    public string SerialNumber; 
    public IEnumerable<IPAddress> IPAddresses; 
} 

public class IPAddress : ValueObject 
{ 
    public string Address; 
} 

每當任何的帳戶或計算機對象更改或用計算機對象更改相關IPAddresses的列表中的值,我需要創建和保存這些實體變更記錄:

public class EntityChange 
{ 
    public string EntityType; 
    public string EntityId; 
    public string PropertyName; 
    public string OldValue; 
    public string NewValue; 
} 

每個被跟蹤實體實現ITrackChanges標記接口和每個值對象從所述的ValueObject基類繼承。值對象被映射爲NHibernate中的組件。

作爲我期望得到的最終結果的一個示例,如果使用Id更新計算機對象並將AssetTag從「ABC123」更改爲「ABC124」,並將IP地址列表從{ 「1.2.3.4」}到{ 「1.2.3.4」, 「1.2.3.5」},我應該得到2個EntityChange記錄:

EntityChange #1 
{ 
    EntityType = "Computer" 
    EntityId = 1 
    PropertyName = "AssetTag" 
    OldValue = "ABC123" 
    NewValue = "ABC124" 
} 

EntityChange #2 
{ 
    EntityType = "Computer" 
    EntityId = 1 
    PropertyName = "IPAddresses" 
    OldValue = "1.2.3.4" 
    NewValue = "1.2.3.4, 1.2.3.5" 
} 

的最佳途徑的任何想法來實現這一點?從我閱讀的文檔看來,我需要編寫一個攔截器和/或事件監聽器,但是除了修改正在更新的實體之外,我一直無法找到任何示例。示例代碼在任何答案中絕對受歡迎。

我是在錯誤的假設,這應該是由NHibernate的支持的東西嗎?我能夠在以前的應用程序中使用LLBLGen作爲ORM,但這是我第一次必須在使用NHibernate的應用程序中實現此功能。

回答

1

你想要的是使用一個會話Iinterceptor。 你可以找到一個使用此審計樣本here

您也可能會從NHibernate mail list得到更多的迴應。