3

在我的应用程序中,我需要对几种不同类型的实体进行字段级更改跟踪。我已经对此进行了谷歌搜索,只能提出关于执行简单的“插入日期”和“更新日期”审计跟踪的示例,您只需修改已经持久化的实体上的字段。我的要求更复杂,因为:

  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 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 的应用程序中实现这一点。

4

1 回答 1

1

您想要的是使用会话 Iinterceptor。您可以在此处找到使用它进行审计的示例

此外,您可能会从NHibernate 邮件列表中获得更多回复。

于 2009-10-02T19:47:00.850 回答