NHibernate Exception发生Id的getter;对象与目标类型不匹配

时间:2010-12-07 18:08:31

标签: c# nhibernate

我正在努力使用NHibernate映射子类。我正在保存我们生成的报告,目前有两种不同的标准类型我要序列化,并希望每个报告存储在一个列(条件)中:基本时间即可。每个报告都有一个XML列,用于非空的条件。这是我的课程:

我的报告类是要映射的主要类:

namespace Core {
    public class Report {
        public virtual int ReportId { get; set; }
        public virtual string Name { get; set; }
        public virtual ReportCriteria Criteria { get; set; }
    }
}

我的 ReportCriteria 类是抽象的,并且由两种标准类型继承:

namespace Core{
    [XmlRoot("Criteria"), Serializable]
    public abstract class ReportCriteria {
        public abstract string GenSql();
    }
}

我的 BasicCriteria 类继承自ReportCriteria并使用GenSql()方法:

namespace Core {
    [XmlRoot("Criteria"), Serializable]
    public class BasicCriteria : ReportCriteria {
        public override string GenSql(){
            //method implementation
        }
    }    
}

我的 TimeCriteria 类继承自ReportCriteria并使用GenSql()方法:

namespace Core {
    [XmlRoot("Criteria"), Serializable]
    public class TimeCriteria : ReportCriteria {
        [Past]
        public virtual DateTime StartDate { get; set; }
        public virtual DateTime EndDate { get; set; }
        public override string GenSql(){
            //method implementation
        }
    }    
}

最后,我的映射文件( Report.hbm.xml)如下:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping namespace="Core" assembly="Core" xmlns="urn:nhibernate-mapping-2.2">
    <class name="Report" table="Report">
        <id name="ReportId">
            <generator class="identity" />
        </id>
        <discriminator column="CriteriaType" />
        <property name="Name" />
        <subclass name="Core.BasicCriteria" discriminator-value="Basic">
            <property name="Criteria" type="Data.NHibernate.XmlSerializableType`1[[Core.BasicCriteria, Core]], Data" />
        </subclass>
        <subclass name="Core.TimeCriteria" discriminator-value="Time">
            <property name="Criteria" type="Data.NHibernate.XmlSerializableType`1[[Core.TimeCriteria, Core]], Data" />
        </subclass>
    </class>
</hibernate-mapping>

Data.NHibernate.XmlSerializableType是一个接受泛型类型并将其序列化以用于数据持久性的类。

请帮我弄清楚我的映射有什么问题,导致发生以下错误: 例如: 出现了Core.Report.ReportId 的异常 内部: 对象与目标类型不匹配。

提前致谢!

2 个答案:

答案 0 :(得分:1)

尝试:

<id name="ReportId" type="Int32">

NHibernate默认尝试解析为字符串,因此您需要告诉它它是一个整数。

<强>更新

您的基本问题是您试图在映射中说明BasicCriteria和TimeCriteria是Report的子类,而不是这种情况。您需要重新考虑映射策略。我已经做了类似的事情已经有一段时间了,但你所暗示的(使用Report表中的条件列)是一个不受支持的多态组件关系。您可能希望查看UserTypes

答案 1 :(得分:1)

就我而言,这是因为通过NH的linq提供程序检索实体的条件包括当它不是IQueryable实例时调用IEnumerable的包含扩展方法。通过ToList()将集合转换为List解决了它,因为ICollection本身支持Contains()。