Построение запроса к IUserType в NHibernate - PullRequest
6 голосов
/ 03 марта 2010

Как создать запрос к пользовательскому полю IUserType в NHibernate?

Более конкретно: Я работаю над приложением Brownfield. У меня есть поле в базе данных с именем «State», которое содержит символ, представляющий, в каком состоянии находится данный объект.

В моем коде я хочу, чтобы это было представлено как перечисление, поэтому я создал перечисление со значением для каждого состояния и создал IUserType, который преобразует значение char из базы данных в мое перечисление и обратно для выбора и обновления.

Я хочу построить запрос, который будет выглядеть примерно так:

session.CreateCriteria<MyType>().Add(Expression.Eq("State", StateEnum.Complete))

Однако этот запрос вызывает исключение:

could not resolve property: State of: MyNamespace.MyType

предположительно, потому что NHibernate не знает, как сделать выборку по полю char базы данных с учетом типа StateEnum.

1 Ответ

6 голосов
/ 08 марта 2010

Ваш класс и отображение должны быть примерно такими:

class MyType
{
    public virtual StateEnum State { get; set; }
}

<class name="MyType">
    <property name="State" type="MyNamespace.MyEnumUserType, MyDll" />
</class>

NHibernate имеет 3 встроенных картографа для перечисления:

  • PersistentEnumType отображается в столбец int и не объявляется в отображении.
  • EnumStringType отображается в столбец varchar. Значения являются значениями ToString () перечисления.
  • EnumCharType отображается в столбец char. Значения являются результатом (char) (int) enumvalue.
...