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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top