如何在NHibernate中进行通用字段和组件级更改跟踪?

时间:2009-10-02 19:22:36

标签: c# .net nhibernate auditing change-tracking

在我的应用程序中,我有一些不同类型的实体,我需要对其进行字段级更改跟踪。我已经搜索了这个,只能提供关于执行简单的“Date Inserted”和“Date Updated”审计跟踪的示例,其中您只需修改已保留的实体上的字段。我的要求更复杂,因为:

  1. 我需要创建代表更改的新实体,而不仅仅是修改正在保存的实体上的字段(与插入的日期,我发现的日期更新示例一样)
  2. 我需要在更新被跟踪实体的同一事务中将这些新实体保存到数据库中
  3. 我需要跟踪附加到跟踪实体的ValueObjects集合的更改
  4. 我不想为每个被跟踪的实体编写单独的日志记录代码
  5. 示例代码:

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

1 个答案:

答案 0 :(得分:1)

你想要的是使用会话Iinterceptor。 您可以在审核here

中找到使用此示例的示例

此外,您可能会从NHibernate mail list获得更多回复。