NHibernate 复合用户类型:如何指定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。这意味着为每个属性提供您自己的用户类型包装器就可以解决问题。
不隶属于 StackOverflow