Frage

Mit NH 2.0 habe ich einen benutzerdefinierten Typ. Es besteht aus vier Eigenschaften zusammengesetzt, so ich implementiert ICompositeUserType.

Ich mag für die Zeichenfolge und Dezimal-Eigenschaften in der Benutzertyp Länge und Genauigkeit bestimmen, zu vermeiden, ist es bei jeder Verwendung in den Mapping-Dateien angeben.

Aber es gibt nur eine PropertyTypes Eigenschaft, zu implementieren, die zurückgibt Ich tippe. Das Komische ist, die IUserType eine SqlTypes Eigenschaft hat, ICompositeUserType nicht.

  • Muss ich beide Schnittstellen implementieren?
  • Muss ich einen Benutzertyp zu implementieren haben jede SQL-Typ zu wickeln Ich möchte angeben?
  • Oder wie kann ich den SQL-Typ für einen zusammengesetzten Benutzertyp angeben?

Vielen Dank.

War es hilfreich?

Lösung 2

ich die Lösung gefunden, es ist ziemlich einfach. Ich habe die NHibernate Typen erstellen die TypeFactory mit:

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

Andere Tipps

Ich empfehle Quellcode Download für diese Art von Graben (NH 2.0).

Zuerst einen Blick auf TypeFactory.HeuristicType Methode nehmen, die die IType Instanz aufbaut.

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

Also, wenn Ihre benutzerdefinierten Typ implementiert ICompositeUserType es als CompositeCustomType Klasse instanziiert wird. Dadurch entfällt die Möglichkeit, beide ICompositeUserType und IUserType Schnittstellen zu implementieren.

Lassen Sie uns jetzt einen Blick in CompositeCustomType nehmen

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;
}

So ist es Ihre Typen zurück von Property nimmt und baut die SQLType für jede Eigenschaft. Dies bedeutet, dass für jede Eigenschaft Ihres eigenen Benutzertyp-Wrapper bietet den Trick.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top