迭代IPersistentCollection项

时间:2010-08-12 12:23:12

标签: nhibernate audit

我正在听NHibernate中的审核事件,特别是OnPostUpdateCollection(PostCollectionUpdateEvent @event)

我想迭代@event.Collection个元素。

@ event.Collection是一个IPersistenCollection,它没有实现IEnumerable。有Entries方法返回IEnumerable,但它需要ICollectionPersister,我不知道在哪里可以获得一个。{/ p>

这里已经提出了问题:http://osdir.com/ml/nhusers/2010-02/msg00472.html,但没有确定的答案。

提前致谢

2 个答案:

答案 0 :(得分: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
    }
}

希望这有帮助!

菲利普

答案 1 :(得分:2)

如果您需要对集合执行更复杂的操作,您可能需要使用以下扩展方法实际获得的集合持久性(实际上,您需要通过{{ 1}}方法):

AbstractCollectionEvent.GetLoadedCollectionPersister

希望它有所帮助!

最诚挚的问候,
Oliver Hanappi