Construindo uma consulta contra o iUserType em Nibernate
-
23-09-2019 - |
Pergunta
Como posso construir uma consulta contra um campo IUSERTYPE personalizado em Nibernate?
Mais especificamente: estou trabalhando em um aplicativo brownfield. Eu tenho um campo no banco de dados chamado "estado", que contém um carvão que representa em que estado um determinado objeto está.
No meu código, quero que isso seja representado como uma enumeração, então criei uma enumeração com um valor para cada estado e criei um iuserType que se converte do valor de char do banco de dados em minha enumeração e volta para selecionar e atualizações.
Eu quero construir uma consulta que se pareça com a seguinte:
session.CreateCriteria<MyType>().Add(Expression.Eq("State", StateEnum.Complete))
No entanto, essa consulta joga uma exceção:
could not resolve property: State of: MyNamespace.MyType
Presumivelmente, porque o Nhibernate não sabe como fazer uma seleção no campo de char do banco de dados, dado um tipo de estadual.
Solução
Sua aula e mapeamento devem ser algo como o seguinte:
class MyType
{
public virtual StateEnum State { get; set; }
}
<class name="MyType">
<property name="State" type="MyNamespace.MyEnumUserType, MyDll" />
</class>
Nhibernate possui 3 mapeadores para enum:
- Persistentenumtype Mapas para uma coluna int e não é declarado no mapeamento.
- EnumstringType Mapas para uma coluna VARCHAR. Os valores são os valores tostring () da enumeração.
- EnumChartype Mapas para uma coluna CHAR. Os valores são o resultado de
(char) (int) enumvalue
.