NHibernate 拦截器审计插入的对象 ID

标签 nhibernate audit interceptor

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

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

明显的问题是当使用 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;            
    }

最佳答案

我通过向我的拦截器类添加一个列表来解决这个问题,该列表在 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;            
    }
}

关于NHibernate 拦截器审计插入的对象 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/892220/

相关文章:

c# - 使用 Moq 模拟 nHibernate QueryOver

nhibernate - 带有复合键的流利NHibernate枚举映射-CheckNotZombied

nhibernate - NHibernate 有没有办法从 View 中通知查询缓存失效?

java - 每个端点的 Camel 拦截器,而不是每个 CamelContext

entity-framework - 如何使用 EF + lambda 表达式隐藏某些列(对于 WCF QueryInterceptor)

.net - 在具有相同架构的多个数据库中使用 EF(或另一个 .NET ORM)

sql-server - 有没有一种优雅的方法来跟踪 SQL Server 2008 中一个表的所有列的修改

database - Spring AOP——数据库审计

java - JaVers - 如何添加额外字段以引用 JSON 中的实体

java - Struts 中拦截器没有被调用