2009-12-21 51 views
0

我有一個StoreHours類,它有一個組合鍵,並且一直在完美工作。另一種需要返回的小時數出現了新的需求。我認爲「簡單,我會抽象基類,有兩個具體實現,並將應用程序中的我的引用更改爲新類之一」。然而,在這樣做,我的單元測試失敗,NHibernate的子類和組合鍵

X.Test.StoreTest.HoursTest:NHibernate.InstantiationException:不能實例化抽象類或接口:X.Model.StoreHours

我的映射文件貌似

<class name="StoreHours" table="StoreHour" abstract="true" discriminator-value="0" > 
    <composite-id> 
     <key-many-to-one name="Store" 
      class="Store" 
      column="StoreUid"/> 
     <key-property name="DayOfWeek" 
      column="DayOfWeekId" 
      type="System.DayOfWeek" /> 
    </composite-id> 
    <discriminator column="StoreHourType" type="Byte" /> 
    <property name="OpenMinutes" column="OpenTime" /> 
    <property name="CloseMinutes" column="CloseTime" /> 
    <subclass name="OfficeHours" discriminator-value="1" /> 
    <subclass name="AccessHours" discriminator-value="2" /> 
</class> 

我發現有人有類似的煩惱here,並開始了他們的解決途徑,但實際上結束了更多的麻煩,比我開始。

我能堅持記錄到數據庫中完美,但onload事件,NHibernate的嘗試實例化抽象的「StoreHours」即使我只得到了一個強類型掀起「OfficeHours」

這似乎是一個真正的微不足道的要求,所以我想我必須做一些簡單的錯誤。所有提示都表示讚賞。

回答

1

The problem is in the way you are using the composite-id

表每類

可與複合-ID,但前提是複合材料 實現爲一類

,所以你需要創建一個類像

在您的StoreHours對象中創建一個使用上述類的屬性(在我的示例中,我稱它爲「StoreHoursCompositeId」)

你映射成爲:

<class name="StoreHours" table="StoreHour" abstract="true" discriminator-value="0" > 
    <composite-id name="StoreHoursCompositeId" class="StoreHoursCompositeId"> 
     <key-many-to-one name="Store" class="Store" 
      column="StoreUid"/> 
     <key-property name="DayOfWeek" 
      column="DayOfWeekId" 
      type="System.DayOfWeek" /> 
    </composite-id> 
    <discriminator column="StoreHourType" type="Byte" /> 
    <property name="OpenMinutes" column="OpenTime" /> 
    <property name="CloseMinutes" column="CloseTime" /> 
    <subclass name="OfficeHours" discriminator-value="1" /> 
    <subclass name="AccessHours" discriminator-value="2" /> 
</class> 

我有同樣的問題,這個固定爲我。

+1

迷人。希望這會幫助某人。不幸的是,這對我來說已經過了4.5年太遲了:)已經將此標記爲沒有嘗試的正確答案。就我而言,我的回答完全是錯誤的。 – toxaq 2014-05-28 10:45:39

+0

哈哈耶,我回答了未來的讀者:-) – 2014-05-28 10:47:55