在我的应用程序中,我有一些不同类型的实体,我需要对其进行字段级更改跟踪。我已经搜索了这个,只能提供关于执行简单的“Date Inserted”和“Date Updated”审计跟踪的示例,其中您只需修改已保留的实体上的字段。我的要求更复杂,因为:
示例代码:
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;
}
每当帐户或计算机对象的任何值发生更改或与计算机对象关联的IP地址列表发生更改时,我都需要创建并保存这些实体更改记录:
public class EntityChange
{
public string EntityType;
public string EntityId;
public string PropertyName;
public string OldValue;
public string NewValue;
}
每个跟踪的实体都实现ITrackChanges标记接口,每个值对象都继承自ValueObject基类。值对象在NHibernate中映射为组件。
作为我希望得到的最终结果的示例,如果我使用Id 1更新Computer对象并将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的应用程序中实现它。
答案 0 :(得分:1)
你想要的是使用会话Iinterceptor。 您可以在审核here
中找到使用此示例的示例此外,您可能会从NHibernate mail list获得更多回复。