NHibernate CompositeUserType:如何指定Sql类型?

时间:2009-05-13 06:40:28

标签: nhibernate usertype compositeusertype

使用NH 2.0,我有一个自定义类型。它由四个属性组成, 所以我实施了ICompositeUserType

我想在用户类型中指定字符串和小数属性的长度和精度,以避免在映射文件中使用每个用法时指定它。

但是只有一个PropertyTypes属性要实现,它返回 ITYPE。有趣的是,IUserType具有SqlTypes属性, ICompositeUserType没有。

  • 我是否必须实现这两个接口?
  • 我是否必须实现用户类型来包装我想要的每个sql类型 指定?
  • 或者如何为复合用户类型指定Sql类型?

非常感谢。

2 个答案:

答案 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

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