NHibernate CompositeUserType: Wie SQL-Typen angeben?
-
21-08-2019 - |
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.
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.