我最近将Windows SmartClient解决方案从nHibernate 2.2升级到4.0,并在写入数据库时遇到异常。
此代码抛出异常:
this.session.Save(this.Location); // NHibernate.ISession
tx.Commit(); // exception thrown here
例外是:
' System.InvalidCastException'在NHibernate.dll中 System.InvalidCastException: 无法转换类型为' System.Collections.ArrayList'的对象 输入' System.Collections.Generic.IEnumerable`1 [System.Object]'。
保存的对象中有几个列表,这里有几个代表性的列表:
protected System.Collections.IList locationList;
public virtual System.Collections.IList AssociatedLocationList
{
get
{
if (this.locationList == null)
{
this.locationList = new System.Collections.ArrayList();
}
return this.locationList;
}
set { this.locationList = value; }
}
protected System.Collections.Generic.IList<Inspection> inspectionList;
public virtual System.Collections.Generic.IList<Inspection> InspectionList
{
get
{
if (this.inspectionList == null)
{
this.inspectionList = new System.Collections.Generic.List<Inspection>();
}
return this.inspectionList;
}
set { this.inspectionList = value; }
}
请注意,有些人指定了类型,有些人没有。
一个建议here将属性设置为IList
,但我已经将其设置为。{/ p>
可以做些什么?
答案 0 :(得分:2)
这里的问题可能是最新版本的NHibernate ..i.e。 4.0
您有以下选项。
1)大多数时候,新版本支持向后兼容性。如果是这种情况,请查找iSession.Save方法的重载版本。你可能也会得到非通用的。
2)可能新的保存方法仅支持泛型类型。你的是非通用的,即ArrayList。如果您可以将其更改为Ilist&lt;&gt;,那应该会有所帮助。
3)如果您无法控制Ilis,那么您可以在其间编写转换器,将转换器转换为Ilist&lt;&gt;它可以使用Save方法。
希望这有帮助。
答案 1 :(得分:2)
NHibernate 4.0中删除了对持久性非泛型集合的支持。转而使用泛型集合。
请参阅NHibernate 4.0 release notes中的重大更改列表。
答案 2 :(得分:1)
我希望我能正确理解你的问题,如果是的话,我不确定你是否需要进行空检查。相反,您的父类应该有一个完全保存在另一个表中的位置列表。
这是您的位置列表所在的类。
zend_extension = xdebug.so
xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.idekey = pass1
xdebug.remote_host = 127.0.0.1
这是定义您的位置的类。
public class Parent
{
public virtual Guid Id { get; set; }
public virtual IList<Location> Locations { get; set; }
//This is the mapping for this class.
public class ParentMapping : ClassMap<Parent>
{
Id(x => x.Id).GeneratedBy.Guid();
//This is what relates your location list to this parent.
//Notice that in the Location object below,
//there's a Owner property which will point back to here.
HasMany(x => x.Locations).Cascade.All();
}
}