1

NHibernate で監査イベントをリッスンしています。具体的にはOnPostUpdateCollection(PostCollectionUpdateEvent @event)

@event.Collection要素を繰り返し処理したい。

@event.Collection はIPersistenCollectionを実装しないIEnumerableです。Entriesを返すメソッドがありますが、IEnumerableどこICollectionPersisterで取得できるかわかりません。

質問は既にhttp://osdir.com/ml/nhusers/2010-02/msg00472.htmlで行われていますが、決定的な答えはありませんでした。

4

2 に答える 2

5

ペドロ、

NHibernate コードを検索すると、IPersistentCollection (@event.Collection) の GetValue メソッドに関する次のドキュメントが見つかりました。

/// <summary>
/// Return the user-visible collection (or array) instance
/// </summary>
/// <returns>
/// By default, the NHibernate wrapper is an acceptable collection for
/// the end user code to work with because it is interface compatible.
/// An NHibernate PersistentList is an IList, an NHibernate PersistentMap is an IDictionary
/// and those are the types user code is expecting.
/// </returns>
object GetValue();

これで、コレクションを IEnumerable にキャストでき、問題なく動作すると結論付けることができます。

バッグをマッピングする小さなサンプルを作成したところ、次のようになりました。

public void OnPostUpdateCollection(PostCollectionUpdateEvent @event)
{
    foreach (var item in (IEnumerable)@event.Collection.GetValue())
    {
        // DO WTVR U NEED
    }
}

お役に立てれば!

フィリペ

于 2010-08-12T14:12:36.587 に答える
2

コレクションでより複雑な操作を行う必要がある場合は、おそらくコレクションの永続化が必要になるでしょう。これは、実際には次の拡張メソッドで取得できます (基本的に、AbstractCollectionEvent.GetLoadedCollectionPersisterメソッドによる可視性を回避する必要があります)。

public static class CollectionEventExtensions
{
    private class Helper : AbstractCollectionEvent
    {
        public Helper(ICollectionPersister collectionPersister, IPersistentCollection collection, IEventSource source, object affectedOwner, object affectedOwnerId)
            : base(collectionPersister, collection, source, affectedOwner, affectedOwnerId)
        {
        }

        public static ICollectionPersister GetCollectionPersister(AbstractCollectionEvent collectionEvent)
        {
            return GetLoadedCollectionPersister(collectionEvent.Collection, collectionEvent.Session);
        }
    }

    public static ICollectionPersister GetCollectionPersister(this AbstractCollectionEvent collectionEvent)
    {
        return Helper.GetCollectionPersister(collectionEvent);
    }
}

それが役に立てば幸い!

よろしく、
オリバー・ハナッピ

于 2011-03-18T08:21:03.507 に答える