Costruire query IUserType in NHibernate
-
23-09-2019 - |
Domanda
Come faccio a costruire una query su un campo IUserType personalizzato in NHibernate?
In particolare: Sto lavorando su un'applicazione brownfield. Ho un campo nel database chiamato "Stato", che contiene un carattere che rappresenta quale stato un dato oggetto è in.
Nel mio codice Voglio che questo essere rappresentato come un enum così ho creato un enum con un valore per ogni stato e creato un IUserType che converte da valore char del db al mio enum e ritorno per seleziona e gli aggiornamenti.
Voglio costruire una query che sembra qualcosa di simile:
session.CreateCriteria<MyType>().Add(Expression.Eq("State", StateEnum.Complete))
Tuttavia, tale query genera un'eccezione:
could not resolve property: State of: MyNamespace.MyType
presumibilmente perché NHibernate non sa come fare un SELECT char campo del DB dato un tipo StateEnum.
Soluzione
La classe e la mappatura dovrebbe essere qualcosa di simile al seguente:
class MyType
{
public virtual StateEnum State { get; set; }
}
<class name="MyType">
<property name="State" type="MyNamespace.MyEnumUserType, MyDll" />
</class>
NHibernate è costruito in 3 mapper per enum:
- PersistentEnumType Mappe per una colonna int, e non è dichiarato nella mappatura.
- EnumStringType Mappe per una colonna varchar. I valori sono il ToString () valori della enum.
- EnumCharType Mappe a una colonna char. I valori sono il risultato di
(char) (int) enumvalue
.