我正在使用 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;            
    }
}

其他提示

尝试一下 OnFlushDirty 方法..或者可能 PostFlush

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top