在我的应用程序中,我需要对几种不同类型的实体进行字段级更改跟踪。我已经对此进行了谷歌搜索,只能提出关于执行简单的“插入日期”和“更新日期”审计跟踪的示例,您只需修改已经持久化的实体上的字段。我的要求更复杂,因为:
- 我需要创建表示更改的新实体,而不仅仅是修改正在保存的实体上的字段(与我发现的插入日期、更新日期示例一样)
- 我需要在更新跟踪实体的同一事务中将这些新实体保存到数据库
- 我需要跟踪附加到被跟踪实体的 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 1 更新计算机对象并将 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 的应用程序中实现这一点。