无法转换类型为' System.Collections.ArrayList'的对象输入' System.Collections.Generic.IEnumerable'

时间:2016-05-13 16:11:35

标签: c# nhibernate

我最近将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>

可以做些什么?

3 个答案:

答案 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();
    }
}