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