NHibernate CompositeUserType: как указать типы Sql? - PullRequest
4 голосов
/ 13 мая 2009

Используя NH 2.0, у меня есть пользовательский тип. Он состоит из четырех свойств, поэтому я реализовал ICompositeUserType.

Я хочу указать длину и точность для строковых и десятичных свойств внутри типа пользователя, чтобы не указывать его при каждом использовании в файлах сопоставления.

Но есть только свойство PropertyTypes, которое возвращает Я печатаю. Самое смешное, что у IUserType есть свойство SqlTypes, ICompositeUserType нет.

  • Должен ли я реализовать оба интерфейса?
  • Нужно ли реализовывать пользовательский тип для переноса каждого sql-типа, который я хочу уточнить?
  • Или как я могу указать тип Sql для составного типа пользователя?

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 22 мая 2009

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

1 голос
/ 01 июля 2009

Я нашел решение, оно довольно простое. Я должен создать типы NHibernate, используя TypeFactory:

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