当NHibernate完全转换一个集合时,会话打开时表示为PersistentGenericBag,但稍后会转换回我在源代码中定义的IList吗?
我认为是在提交事务或会话断开时。但是我正在编写一个单元测试,无论我关闭,刷新,提交和断开多少东西,我的对象总是有一个PersistentGenericBag,而不是List。
由于
答案 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