Построение запроса к IUserType в NHibernate
-
23-09-2019 - |
Вопрос
Как я могу создать запрос к пользовательскому полю IUserType в NHibernate?
Более конкретно:Я работаю над уже существующим приложением.У меня есть поле в базе данных под названием «Состояние», которое содержит символ, показывающий, в каком состоянии находится данный объект.
В моем коде я хочу, чтобы это было представлено в виде перечисления, поэтому я создал перечисление со значением для каждого состояния и создал IUserType, который преобразует значение char из базы данных в мое перечисление и обратно для выбора и обновления.
Я хочу создать запрос, который выглядит примерно так:
session.CreateCriteria<MyType>().Add(Expression.Eq("State", StateEnum.Complete))
Однако этот запрос выдает исключение:
could not resolve property: State of: MyNamespace.MyType
предположительно потому, что NHibernate не знает, как выполнить выборку по полю char БД с учетом типа StateEnum.
Решение
Ваш класс и сопоставление должны быть примерно такими:
class MyType
{
public virtual StateEnum State { get; set; }
}
<class name="MyType">
<property name="State" type="MyNamespace.MyEnumUserType, MyDll" />
</class>
NHibernate имеет 3 встроенных преобразователя для перечисления:
- Персистентенумтипе сопоставляется со столбцом int и не объявляется при сопоставлении.
- EnumStringType сопоставляется со столбцом varchar.Значения представляют собой значения ToString() перечисления.
- Энумчартипе сопоставляется со столбцом символов.Ценности являются результатом
(char) (int) enumvalue
.