NHibernate 何时将一个集合转换为一个集合,当 Session 打开时表示为 PersistentGenericBag,但后来又转换回我在源代码中定义的 IList?
我以为是在提交事务或会话断开连接的时候。但是我正在编写一个单元测试,无论我关闭、刷新、提交和断开多少东西,我的对象总是有一个 PersistentGenericBag,而不是一个列表。
谢谢
NHibernate 何时将一个集合转换为一个集合,当 Session 打开时表示为 PersistentGenericBag,但后来又转换回我在源代码中定义的 IList?
我以为是在提交事务或会话断开连接的时候。但是我正在编写一个单元测试,无论我关闭、刷新、提交和断开多少东西,我的对象总是有一个 PersistentGenericBag,而不是一个列表。
谢谢
别弄错我的意思。但是你真的有这样的映射吗?
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[系统字符串]`
我在您的映射中期望的是IList<>。因为这将允许 NHibernate 注入它自己的实现。即:PersistentGenericBag
public class MyObject
{
public virtual IList<string> MyColl { get; set; }
}
在这种情况下,答案是:从不。MyObject的代理提供了 IList<> 发布的所有功能,同时仍然使用类型的属性PersistentGenericBag
什么时候真正有人居住?首次访问时(通过 getter)。的内部实现PersistentGenericBag
将执行 sql 查询并将数据加载到内部 IList<> 中。当然会话必须仍然打开并连接到 MyObject