代码之家  ›  专栏  ›  技术社区  ›  toxaq

NHibernate子类和复合键

  •  0
  • toxaq  · 技术社区  · 16 年前

    我有一个具有复合密钥的类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 回复  |  直到 11 年前
        1
  •  1
  •   user1047100    11 年前

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

    每个类的表使用复合ID,但仅当复合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>
    

    我也有同样的问题,这个问题解决了。