Подклассы NHibernate и составные ключи - PullRequest
0 голосов
/ 21 декабря 2009

У меня есть класс 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»

Это кажется довольно тривиальным требованием, поэтому я полагаю, что я должен сделать что-то простое неправильно. Все подсказки приветствуются.

1 Ответ

1 голос
/ 28 мая 2014

Проблема в том, как вы используете составной идентификатор

Таблица для класса работает с 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>

У меня была та же проблема, и это исправило ее для меня.

...