Вопрос

Используя 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 для каждого свойства.Это означает, что предоставление собственных оболочек пользовательских типов для каждого свойства поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top