在我的應用程序中,我有幾種不同類型的實體,我需要對其進行字段級更改跟蹤。我已經爲此搜索了,只能舉出簡單的「插入日期」和「更新日期」審計跟蹤的例子,您只需修改已被持久化的實體上的字段。我的要求是更復雜,因爲:如何在NHibernate中進行通用字段和組件級別更改跟蹤?
- 我需要建立代表變化不只是修改了實體領域的新的實體被保存(如插入日期,更新日期的例子,我發現)
- 我需要保存這些新的實體到數據庫在同一事務更新跟蹤實體
- 我需要跟蹤更改連接到被追蹤實體ValueObjects集合
- 我不希望有寫爲單獨的日誌代碼每一個跟蹤實體
示例代碼:
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的應用程序中實現此功能。