Возможна ли навигация по ключу много-к-одному композитного идентификатора?

2

Можно ли перемещаться по ассоциациям "ключ-много-один" составного идентификатора в Nhibernate?

У меня есть несколько (устаревших) таблиц, которые я сопоставил со следующими настройками:

<class name="StructureUser">
    <composite-id>
        <key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" />
        <key-many-to-one name="User" class="User" column="USERID" />
    </composite-id>
    ...
</class>

<class name="Structure">
    <id name="Id" column="id" type="Int32" >
        <generator class="native"/>
    </id>
    <property name="Low" column="low" type="Int32" />
    ...
</class>

Я хочу получить доступ к свойству "Низкий" структуры через класс StructureUser в запросе. Я пробовал каждое использование API критериев, о котором я мог думать, но всегда ошибка. Вот два из запросов, которые я пробовал:

ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser))
    .CreateAlias("Structure", "struc")
    .Add(Restrictions.Le("struc.Low", 123));

ICriteria crit2 = Session.CreateCriteria(typeof(StructureUser))
    .Add(Restrictions.Le("Structure.Low", 123));

Ошибка в crit1 поступает из базы данных и говорит, что "struc_1.Low недействителен в этом контексте", поскольку NHibernate не создает соединение, необходимое для ограничения в команде sql. Ошибка в crit2 происходит из NHibernate, сообщая мне, что он не может получить доступ к свойству Structure.Low на StructureUser.

Я обошел эту проблему, объявив составной идентификатор с элементами ключа-свойства и объявив отношения с обычными элементами "много-к-одному".

Есть ли другое решение этой проблемы?

  • 0
    Я сталкиваюсь с подобной проблемой.
Теги:
join
nhibernate

2 ответа

0

У меня была аналогичная проблема.

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

Затем вы можете сохранить его в составном идентификаторе, вам не нужно изменять его в элемент key-property.

<class name="StructureUser">
<composite-id>
    <key-many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" />
    <key-many-to-one name="User" class="User" column="USERID" />
</composite-id>

<many-to-one name="Structure" class="Structure" column="STRUKTUR_ID" insert="false" update="false" />

...

0

Вы пробовали

ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser))
    .CreateCriteria("Structure", "struc")
    .Add(Restrictions.Le("struc.Low", 123));
  • 0
    Я не помню :). Надо попробовать на следующей неделе, когда я вернусь на работу.
  • 0
    Хорошо, это заняло у меня больше года, но я наконец проверил это. К сожалению, ваше предложение тоже не работает :(.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню