Проблема отображения Nhibernate: свойство, тип которого является суперклассом - PullRequest
2 голосов
/ 19 октября 2010

У меня есть объект NHibernate, который является суперклассом (назовем его «Super»), и подкласс, который наследуется от него (скажем, он называется «Sub»).

<class name="Super" table="SuperThings">
    <id name="Id" type="System.Int32" column="SuperId">
        <generator class="identity" />
    </id>

    <joined-subclass name="Sub" table="SubThings" extends="Super" lazy="true">
        <key column="SubId" />
    </joined-subclass>
</class>

У меня есть отдельный класс (называемый "Widget") со свойством типа Super.

<class name="Widget" table="Widgets" lazy="true">
    <id name="Id" type="System.Int32" column="NoteId">
      <generator class="identity" />
    </id>
    <many-to-one name="SuperProperty" column="SuperId" class="SuperClass" />
</class>

Когда я получаю доступ к SuperProperty для экземпляра виджета, NHibernate пытается его лениво загрузить, но я получаю эту ошибку:

Найдено более одной строки с данным идентификатором: 1, для класса: Super

В SuperThings есть только одна запись с идентификатором 1 и отдельная запись в SubThings, связанная с ней. После использования NHibernate Profiler и отладки моего кода похоже, что NHibernate пытается создать экземпляр объекта, тип которого является подклассом.

Почему он это делает? Есть ли что-то не так с тем, как я думаю, это должно быть сопоставлено?

Очевидно, это упрощенная версия того, с чем я на самом деле работаю. У объектов, с которыми я работаю, гораздо больше свойств разных типов, поэтому, возможно, я не учел, что на самом деле вызывает проблему, но я хотел убедиться, что я понимаю вещи, по крайней мере, на базовом уровне.

1 Ответ

2 голосов
/ 19 октября 2010

Если в SuperThings есть запись с Id = 1 и одна запись в SubThings с SubId = 1, в соответствии с вашим отображением у вас есть экземпляр Sub, поэтому NHibernate прав, когда пытается его создать.

Если это не то, что вы намеревались, вам следует перечитать Глава 8. Карта наследования , чтобы увидеть альтернативы.

...