NHibernate子类和复合键

时间:2009-12-21 03:28:31

标签: nhibernate subclass composite-id

我有一个StoreHours类,它有一个复合键,并且一直运行良好。一个新的需求出现了另一种类型的返回时间。我认为“简单,我将抽象基类,有两个具体的实现,并将我在应用程序中的引用更改为其中一个新类”。但是,在执行此操作时,我的单元测试失败了

  

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 个答案:

答案 0 :(得分:1)

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

  

Table-per-class适用于Composite-id,但仅限于复合词   作为一个类实现

所以你需要创建一个像

这样的类
public class StoreHoursCompositeId
 {
        public virtual Store Store { get; set; }
        public virtual DayOfWeek DayOfWeek { get; set; }

        // Implement GetHashCode(), is NH-mandatory
        // Implement Equals(object obj), is NH-mandatory
}

在您的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>

我遇到了同样的问题而且这个问题已经解决了。