2009-12-21 58 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