使用 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