NHibernate CompositeUserType: Cómo especificar tipos SQL?
-
21-08-2019 - |
Pregunta
Uso de NH 2.0, tengo un tipo personalizado. Se compone de cuatro propiedades,
por lo que he implementado ICompositeUserType
.
Quiero especificar la longitud y la precisión de la cadena y propiedades decimales en el tipo de usuario, para evitar que especifica que con cada uso de los archivos de asignación.
Pero sólo hay una propiedad PropertyTypes
de implementar, que devuelve
Yo tecleo. Lo curioso es, la IUserType
tiene una propiedad SqlTypes
,
<=> no.
- ¿Tengo que poner en práctica las dos interfaces?
- ¿Tengo que poner en práctica un tipo de usuario a envolver cada sql de tipo Quiero ¿especificar?
- O ¿cómo puedo especificar el tipo SQL para un tipo de usuario compuesto?
Muchas gracias.
Solución 2
He encontrado la solución, es bastante simple. Tengo que crear los tipos de NHibernate mediante el TypeFactory
:
public IType[] PropertyTypes
{
get
{
return new []
{
TypeFactory.GetDecimalType(36, 18),
TypeFactory.GetStringType(100)
}
}
}
Otros consejos
I recomiendo la descarga de código fuente de este tipo de excavación (NH 2.0).
En primer lugar echar un vistazo a TypeFactory.HeuristicType método, que se basa la instancia iType.
...
else if (typeof(ICompositeUserType).IsAssignableFrom(typeClass))
{
type = new CompositeCustomType(typeClass, parameters);
}
else if (typeof(IUserType).IsAssignableFrom(typeClass))
{
type = new CustomType(typeClass, parameters);
}
...
Así que si el tipo personalizado implementa ICompositeUserType que se crea una instancia de clase como CompositeCustomType. Esto elimina la posibilidad de implementar ambas interfaces ICompositeUserType y IUserType.
Ahora vamos a echar un vistazo a 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;
}
Así que toma sus tipos regresaron de PropertyTypes y construye la SQLTYPE para cada propiedad. Esto significa que el suministro de sus propios envoltorios tipo de usuario para cada propiedad hará el truco.