2010-12-07 41 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()有本地支持。

相關問題