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