什么时候NHibernate将Lazy Collection转换回List

时间:2012-11-07 16:56:32

标签: nhibernate

当NHibernate完全转换一个集合时,会话打开时表示为PersistentGenericBag,但稍后会转换回我在源代码中定义的IList吗?

我认为是在提交事务或会话断开时。但是我正在编写一个单元测试,无论我关闭,刷新,提交和断开多少东西,我的对象总是有一个PersistentGenericBag,而不是List。

由于

1 个答案:

答案 0 :(得分:1)

别误会我的意思。但你真的有这样的映射吗?

public class MyObject 
{
    public virtual List<string> MyColl { get; set; }
}

因为我的经验说,这最终会出现这样的异常:

NHibernate.PropertyAccessException: Invalid Cast (check your mapping for property type mismatches); setter of MyLib.MyObject ---> System.InvalidCastException: Unable to cast object of type 'NHibernate.Collection.Generic.PersistentGenericBag'1[System.String]' to type 'System.Collections.Generic.List 1 [System.String]`

我希望您的映射中包含 IList&lt;&gt; 。因为正是这将允许NHibernate注入它自己的实现。即:PersistentGenericBag

public class MyObject 
{
    public virtual IList<string> MyColl { get; set; }
}

在这种情况下,答案是从不 MyObject 的代理提供IList&lt;&gt;发布的所有功能。同时仍使用PersistentGenericBag

类型的属性

它什么时候真正填充?首次访问时(通过getter)。 PersistentGenericBag的内部实现将执行sql查询并将数据加载到内部IList&lt;&gt;中。当然,会话必须仍然打开并连接到MyObject