NHibernate CompositeUserType: Como especificar tipos SQL?
-
21-08-2019 - |
Pergunta
Usando NH 2.0, eu tenho um tipo personalizado. É composto por quatro propriedades,
então eu implementado ICompositeUserType
.
Eu quero especificar comprimento e precisão para a cadeia e decimais propriedades dentro do tipo de usuário, para evitar especificando-lo com cada uso nos arquivos de mapeamento.
Mas há apenas uma propriedade PropertyTypes
de implementar, que retorna
Eu digito. O engraçado é que, a IUserType
tem uma propriedade SqlTypes
,
ICompositeUserType
não.
- Eu tenho que implementar ambas as interfaces?
- Eu tenho que implementar um tipo de usuário para embrulhar cada sql-digitar Eu quero especificamos?
- Ou como posso especificar o tipo de SQL para um tipo de usuário composta?
Muito obrigado.
Solução 2
Eu encontrei a solução, é muito simples. Eu tenho que criar os tipos NHibernate usando o TypeFactory
:
public IType[] PropertyTypes
{
get
{
return new []
{
TypeFactory.GetDecimalType(36, 18),
TypeFactory.GetStringType(100)
}
}
}
Outras dicas
Eu recomendo baixar o código-fonte para este tipo de escavação (NH 2.0).
Primeiro dê uma olhada método TypeFactory.HeuristicType, que constrói a instância IType.
...
else if (typeof(ICompositeUserType).IsAssignableFrom(typeClass))
{
type = new CompositeCustomType(typeClass, parameters);
}
else if (typeof(IUserType).IsAssignableFrom(typeClass))
{
type = new CustomType(typeClass, parameters);
}
...
Portanto, se seus tipo implementa personalizados ICompositeUserType ele é instanciado como classe CompositeCustomType. Isso elimina a possibilidade de implementar ambas as interfaces IUserType ICompositeUserType e.
Agora vamos dar uma olhada em CompositeCustomType
public override SqlType[] SqlTypes(IMapping mapping)
{
IType[] types = userType.PropertyTypes;
SqlType[] result = new SqlType[GetColumnSpan(mapping)];
int n = 0;
for (int i = 0; i < types.Length; i++)
{
SqlType[] sqlTypes = types[i].SqlTypes(mapping);
for (int k = 0; k < sqlTypes.Length; k++)
{
result[n++] = sqlTypes[k];
}
}
return result;
}
Por isso, leva seus tipos retornados PropertyTypes e constrói a SQLTYPE para cada propriedade. Isto significa que fornecer seus próprios invólucros tipo de usuário para cada propriedade vai fazer o truque.