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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top