使用NH 2.0,我有一个自定义类型。它由四个属性组成,
所以我实施了ICompositeUserType
。
我想在用户类型中指定字符串和小数属性的长度和精度,以避免在映射文件中使用每个用法时指定它。
但是只有一个PropertyTypes
属性要实现,它返回
ITYPE。有趣的是,IUserType
具有SqlTypes
属性,
ICompositeUserType
没有。
非常感谢。
答案 0 :(得分:3)
我建议下载此类挖掘的源代码(NH 2.0)。
首先看一下构建IType实例的TypeFactory.HeuristicType方法。
...
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 :(得分:1)
我找到了解决方案,很简单。我必须使用TypeFactory
:
public IType[] PropertyTypes
{
get
{
return new []
{
TypeFactory.GetDecimalType(36, 18),
TypeFactory.GetStringType(100)
}
}
}