NHibernate CompositeUserType:Как указать типы SQL?
-
21-08-2019 - |
Вопрос
Используя NH 2.0, у меня есть собственный тип.Он состоит из четырех свойств, поэтому я реализовал ICompositeUserType
.
Я хочу указать длину и точность для строковых и десятичных свойств. внутри типа пользователя, чтобы не указывать его при каждом использовании в файлах сопоставления.
Но есть только PropertyTypes
свойство для реализации, которое возвращает Itype.Самое смешное, что IUserType
имеет SqlTypes
свойство,ICompositeUserType
не.
- Нужно ли мне реализовывать оба интерфейса?
- Должен ли я реализовать тип пользователя, чтобы обернуть каждый тип SQL, который я хочу указать?
- Или как указать тип Sql для составного типа пользователя?
Большое спасибо.
Решение 2
Решение я нашел, оно довольно простое.Мне нужно создать типы NHibernate, используя TypeFactory
:
public IType[] PropertyTypes
{
get
{
return new []
{
TypeFactory.GetDecimalType(36, 18),
TypeFactory.GetStringType(100)
}
}
}
Другие советы
Рекомендую скачать исходники для такого типа копания (NH 2.0).
Сначала взгляните на метод TypeFactory.HeuristicType, который создает экземпляр IType.
...
else if (typeof(ICompositeUserType).IsAssignableFrom(typeClass))
{
type = new CompositeCustomType(typeClass, parameters);
}
else if (typeof(IUserType).IsAssignableFrom(typeClass))
{
type = new CustomType(typeClass, parameters);
}
...
Поэтому, если ваш пользовательский тип реализует ICompositeUserType, он создается как класс CompositeCustomType.Это исключает возможность реализации интерфейсов ICompositeUserType и IUserType.
Теперь давайте посмотрим на 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;
}
Поэтому он берет ваши типы, возвращенные из PropertyTypes, и создает SqlType для каждого свойства.Это означает, что предоставление собственных оболочек пользовательских типов для каждого свойства поможет.