NHibernate 拦截器审核插入的对象 ID
-
23-08-2019 - |
题
我正在使用 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
?
不隶属于 StackOverflow