2011-01-25 8 views
0

Есть ли способ создать «псевдоним» для компонента?
У меня есть «Criteria Builder», который берет строки в формате «Address.City» (или «User.Address.City», ...) и создает на его основе ICriteria (фильтры и сортировки).
Я использую компоненты для сопоставления класса «Адрес», поэтому он остается в той же таблице, что и «Пользователь».Сопоставление компонентов NHibernate (создание критериев)

Исключение я получаю:
NHibernate.QueryExceptioncould не решить собственности: Город: MyNamespace.User

Если я пытаюсь не создавать «псевдоним» для компонента адреса, он работает просто отлично ,
Однако, поскольку это построитель критериев, есть ли способ обнаружить, что «Адрес» является компонентом и избегать критериев вызова. Создайте ссылку («Адрес»)? Любая работа вокруг?

This - тот же вопрос, что и у меня, однако решение для меня небезопасно (я не создаю критерии для каждого запроса вручную).

Любая помощь была бы высоко оценена!

+0

Можете ли вы опубликовать часть своего кода? – Vadim

+0

@Yads - У меня на самом деле нет кода со мной прямо сейчас. Он должен быть простым, как класс «Пользователь», ссылающийся на класс «Адрес» через свойство. В сопоставлении для пользователя у меня есть «Адрес» в качестве компонента. Посмотрите на https://forum.hibernate.org/viewtopic.php?p=2335410&sid=37a2a95223e929ae6cccfc183af6af28, поскольку он очень похож на мою проблему. Благодаря! – Frederico

ответ

1

Вы не можете создать псевдоним для адреса, потому что Адрес не является отображаемым объектом. Единственное различие между CreateAlias и CreateCriteria состоит в том, что первый возвращает исходные критерии, тогда как последний возвращает новый Subcriteria. Таким образом, единственными классами, к которым вы можете создать критерии, являются классы, которые были сопоставлены. Поскольку компоненты не являются сопоставленными классами, вы не можете создавать критерии вокруг них.

Единственное, что у меня есть, - это иметь свой класс Address для реализации пустого интерфейса дескриптора, такого как IComponent, или пометить его с помощью специального ComponentAttribute. Затем ваш CriteriaBuilder может проверить, имеет ли класс, для которого он создает критерии, эти метаданные и игнорирует его.

+0

Я думаю, что использование рефлекса для проверки атрибута было бы слишком дорого (моя начальная точка - это строка «Address.City»). Разве у вас есть что-то еще в виду? Как бы «пустой дескриптор» помог в этом случае? Не могли бы вы разместить какой-то код? Все, что мне было нужно, это CreateAlias, чтобы быть достаточно умным и определить, был ли класс компонентом, или метод, который мог бы сказать мне, что ... =/Спасибо за помощь! – Frederico

+0

@Frederico, я не совсем уверен, не видя ваш код, как работает ваш CriteraiBuilder. Возможно, вы можете просто сделать чек, например 'if (objToMap является IComponent) // не вызывать CreateAlias' – Vadim