Можно ли перемещаться по ассоциациям "ключ-много-один" составного идентификатора в 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.
Я обошел эту проблему, объявив составной идентификатор с элементами ключа-свойства и объявив отношения с обычными элементами "много-к-одному".
Есть ли другое решение этой проблемы?
У меня была аналогичная проблема.
Как сказал оригинальный плакат, вам нужно добавить отношение "один к одному" в элементе из составного ключа, который вы хотите добавить в псевдоним , и вам нужно установить свойства "вставить" и "обновить" на "ложь" .
Затем вы можете сохранить его в составном идентификаторе, вам не нужно изменять его в элемент 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" />
...
Вы пробовали
ICriteria crit1 = Session.CreateCriteria(typeof(StructureUser))
.CreateCriteria("Structure", "struc")
.Add(Restrictions.Le("struc.Low", 123));