Question

Utilisation de NH 2.0, j'ai un type personnalisé. Il est composé de quatre propriétés, donc je mis en œuvre ICompositeUserType.

Je veux spécifier la longueur et la précision de la chaîne et les propriétés décimales dans le type d'utilisateur, pour éviter de spécifier avec chaque utilisation dans les fichiers de mappage.

Mais il y a seulement une propriété à mettre en œuvre PropertyTypes, qui retourne J'écris. La chose drôle est, la propriété a une IUserType SqlTypes, Ne le fait pas <=>.

  • Dois-je mettre en œuvre les deux interfaces?
  • Dois-je mettre en œuvre un type d'utilisateur pour envelopper chaque type sql Je veux spécifier?
  • Ou comment puis-je spécifier le type Sql pour un type composite utilisateur?

Merci beaucoup.

Était-ce utile?

La solution 2

J'ai trouvé la solution, il est assez simple. Je dois créer les types NHibernate en utilisant le TypeFactory:

public IType[] PropertyTypes
{
  get
  {
    return new []
    {
      TypeFactory.GetDecimalType(36, 18),
      TypeFactory.GetStringType(100)
    }
  }
}

Autres conseils

Je recommande le téléchargement de code source pour ce type de creusement (NH 2.0).

Consultez tout d'abord à la méthode TypeFactory.HeuristicType, qui construit l'instance ITYPE.

...
else if (typeof(ICompositeUserType).IsAssignableFrom(typeClass))
{
    type = new CompositeCustomType(typeClass, parameters);
}
else if (typeof(IUserType).IsAssignableFrom(typeClass))
{
    type = new CustomType(typeClass, parameters);
}
...

Donc, si votre type personnalisé implémente ICompositeUserType il s'instancié comme classe CompositeCustomType. Ceci élimine la possibilité de mettre en œuvre les deux interfaces ICompositeUserType et IUserType.

Maintenant, nous allons jeter un coup d'oeil dans 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;
}

Il faut donc vos types de revenus PropertyTypes et construit sqltype pour chaque propriété. Cela signifie que fournir vos propres emballages de type utilisateur pour chaque propriété fera l'affaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top