NHibernate拦截器审计插入对象ID

5
我正在使用NHibernate拦截器记录有关各种实体的更新/插入/删除信息。
记录的信息包括实体类型和修改的实体的唯一标识符。在NHibernate映射文件中,唯一标识符被标记为。
明显的问题是,在使用IInterceptor.OnSave()记录插入操作时,实体的ID尚未分配。
如何在记录审核信息之前获取已插入实体的ID?
(我已经研究了NHibernate监听器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;            
    }
2个回答

10

我通过向我的拦截器类添加一个列表,并在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;            
    }
}

0
尝试使用OnFlushDirty方法,或者也可以考虑使用PostFlush
编辑:另外,请问你能否贴出你的代码?你不是在OnSave方法中获得了Id参数吗?

谢谢回复。 我已经尝试了PostFlush,但是如何知道ICollection实体参数中哪些项目是刚刚插入的呢?如果有一种方法可以识别出这些项目,那就可以正常工作了... - TonE
我相信他们全部都是这样的..不是吗? - Matt Hinze
不,该集合包含所有已从数据库更新状态的对象。 - TonE
好的,我改正了。也许这需要向NH用户做出说明。 - Matt Hinze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接