Constructing query against IUserType in NHibernate

935 views Asked by At

How can I construct a query against an custom IUserType field in NHibernate?

More specifically: I'm working on a brownfield application. I have a field in the database called "State" which contains a char representing what state a given object is in.

In my code I want this to be represented as an enum so I've created an enum with a value for each state and created an IUserType that converts from the db's char value to my enum and back for selects & updates.

I want to construct a query that looks something like this:

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

However, that query throws an exception:

could not resolve property: State of: MyNamespace.MyType

presumably because NHibernate doesn't know how to do a select against the DB's char field given a StateEnum type.

1

There are 1 answers

1
Lachlan Roche On BEST ANSWER

Your class and mapping should be something like the following:

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

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

NHibernate has 3 built in mappers for enum:

  • PersistentEnumType maps to an int column, and is not declared in the mapping.
  • EnumStringType maps to a varchar column. The values are the ToString() values of the enum.
  • EnumCharType maps to a char column. The values are the result of (char) (int) enumvalue.