2010-12-07 43 views
1

我正在努力使用NHibernate映射子类。我正在保存我们生成的报告,目前有两种不同的标准类型,我正在序列化并希望将其存储在每个报告的一列(标准)中:基本时间。每个报告都会有一个非空的条件的XML列。这里是我的课:NHibernate异常发生Id的getter;对象与目标类型不匹配

报告类是主要的类映射:

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的异常 内蒙古:对象不匹配目标类型。

在此先感谢!

回答

1

尝试:

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

NHibernate的尝试,所以你需要告诉它,它是一个整数,以解决由默认的字符串。

更新

您的基本问题是,你正试图在映射说BasicCriteria和TimeCriteria是报告的子类是不是这种情况。你需要重新考虑你的映射策略。自从我做了这样的事情之后已经有一段时间了,但您暗示的内容(使用Report表中的标准列)是一种不支持的多态组件关系。你可能想看一个UserTypes

+0

谢谢,但我实际上已经在我目前的代码中,并仍然得到相同的错误。道歉:我从上述代码中剥离了这些细节以便于阅读。这个问题肯定是指向我的子类。一切工作,直到我试图映射这些。 – BueKoW 2010-12-07 18:19:59

1

在我的情况下,这是因为通过NH的linq提供程序检索实体的条件包括在不是IQueryable实例时调用IEnumerable的Contains扩展方法。将集合转换为List by ToList()解决它,因为ICollection对Contains()有本地支持。

相关问题