【问题标题】:NHibernate Interceptor Auditing Inserted Object IdNHibernate 拦截器审计插入的对象 ID
【发布时间】:2010-10-27 21:25:30
【问题描述】:

我正在使用 NHibernate 拦截器将有关更新/插入/删除的信息记录到我的各个实体。

记录的信息中包含实体类型和已修改实体的唯一 ID。唯一 ID 在 NHibernate 映射文件中标记为 <generator class="identity">

明显的问题是当使用 IInterceptor.OnSave() 记录插入操作时,尚未分配实体的 ID。

在记录审计信息之前如何获取插入实体的Id?

(我已经研究过 NHibernate Listeners PostSave 事件,但无法让它们与正在使用的 Spring.net 配置一起工作,所以如果可能的话,我想坚持使用拦截器)

代码:

    // object id parameter is null...
    public override bool OnSave(object entity, object id, object[] state, 
        string[] propertyNames, IType[] types)
    {            
        AddAuditItem(entity, INSERT);
        return false;            
    }

【问题讨论】:

    标签: nhibernate audit interceptor


    【解决方案1】:

    我通过在我的拦截器类中添加一个列表来解决这个问题,该列表在OnSave 实现期间填充了对象。

    PostFlush 实现中,列表被迭代,每个元素都被审计为插入。此列表中的对象已持久化在 PostFlush() 中,因此已生成 ID。

    这似乎工作正常,但如果指出任何潜在的陷阱,我将不胜感激:-)

    public class AuditInterceptor : EmptyInterceptor
    {       
        // To hold inserted items to be audited after insert has been flushed
        private IList<object> insertItems = new List<object>();
    
        public override void PostFlush(System.Collections.ICollection entities)
        {            
            foreach (var entity in insertItems)
            {
                AddAuditItem(entity, INSERT);
            }
            insertItems.Clear();
    
            base.PostFlush(entities);
        }
    
        public override bool OnSave(object entity, object id, object[] state, 
            string[] propertyNames, IType[] types)
        {            
            var auditable = entity as IAuditable;
            if (auditable != null) 
                insertItems.Add(entity);
    
            return false;            
        }
    }
    

    【讨论】:

      【解决方案2】:

      试试OnFlushDirty 方法.. 或者PostFlush

      编辑:另外,您可以发布您的代码吗?你不把Id作为OnSave的参数吗?

      【讨论】:

      • 感谢您的回复。我已经尝试过 PostFlush,但我如何知道 ICollection 实体参数中的哪些项目是刚刚插入的项目?如果有一种方法可以识别它,它会工作正常......
      • 我相信他们所有人..不是这样吗?
      • 不,该集合包含所有已从数据库更新其状态的对象。
      • 好的,我已经纠正了。也许这需要提醒用户注意。
      猜你喜欢
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2017-02-07
      • 2019-02-11
      相关资源
      最近更新 更多