NHibernateはインターセプタ監査挿入されたオブジェクトID
-
23-08-2019 - |
質問
私はアップデート/挿入/私の様々なエンティティに削除に関する情報を記録するためにNHibernateのインターセプタを使用しています。
ログイン情報に含まれる修正エンティティのエンティティタイプと固有のIDです。固有IDはNHibernateのマッピングファイル内<generator class="identity">
としてマークされます。
明白な問題がある。
どのように監査情報をログに記録する前に挿入されたエンティティの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;
}
解決
私はOnSave
実施中のオブジェクトが移入され、私のインターセプタクラスにリストを追加することで、この問題を回避働いてきます。
PostFlush
の実装では、リストは、反復処理され、各要素は、インサートとして監査されます。このリスト内のオブジェクトはPostFlush()
に永続化されているので、IDを生成しています。
これはOK動作するようですが、どの潜在的な落とし穴を指摘された場合、私は感謝されるだろう: - )
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
編集:また、あなたのコードを投稿することができますか?あなたはOnSave
するパラメータとしてIDを取得しないでください?
所属していません StackOverflow