0

我有一个类 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>

我在这里找到了有类似问题的人并开始了他们的解决方案,但实际上最终遇到的麻烦比我开始时还要多。

我可以完美地将记录保存到数据库中,但是在加载时,NHibernate 正在尝试实例化抽象的“StoreHours”,即使我只有一个强类型设置“OfficeHours”

这似乎是一个非常微不足道的要求,所以我认为我必须做一些简单的错误。所有提示表示赞赏。

4

1 回答 1

1

问题在于您使用复合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>

我遇到了同样的问题,这为我解决了这个问题。

于 2014-05-28T09:14:21.070 回答