質問

私はアップデート/挿入/私の様々なエンティティに削除に関する情報を記録するためにNHibernateのインターセプタを使用しています。

ログイン情報に含まれる修正エンティティのエンティティタイプと固有のIDです。固有IDはNHibernateのマッピングファイル内<generator class="identity">としてマークされます。

エンティティのIDがまだ割り当てられていない)(IInterceptor.OnSaveを使用して挿入操作をログに記録する際に、

明白な問題がある。

どのように監査情報をログに記録する前に挿入されたエンティティの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を取得しないでください?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top