我正在努力使用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 的异常 内部: 对象与目标类型不匹配。
提前致谢!
答案 0 :(得分:1)
尝试:
<id name="ReportId" type="Int32">
NHibernate默认尝试解析为字符串,因此您需要告诉它它是一个整数。
<强>更新强>
您的基本问题是您试图在映射中说明BasicCriteria和TimeCriteria是Report的子类,而不是这种情况。您需要重新考虑映射策略。我已经做了类似的事情已经有一段时间了,但你所暗示的(使用Report表中的条件列)是一个不受支持的多态组件关系。您可能希望查看UserTypes
答案 1 :(得分:1)
就我而言,这是因为通过NH的linq提供程序检索实体的条件包括当它不是IQueryable实例时调用IEnumerable的包含扩展方法。通过ToList()将集合转换为List解决了它,因为ICollection本身支持Contains()。