NHibernate CompositeUserType:如何指定Sql类型?

NHibernate CompositeUserType:如何指定Sql类型?,nhibernate,usertype,compositeusertype,Nhibernate,Usertype,Compositeusertype,使用NH2.0,我有一个自定义类型。它由四个属性组成, 所以我实现了ICompositeUserType 我想在用户类型中指定字符串和小数属性的长度和精度,以避免在映射文件中每次使用时都指定它 但是只有一个PropertyTypes属性要实现,它返回 它的类型。有趣的是,IUserType有一个SqlTypes属性, ICompositeUserType没有 我必须实现这两个接口吗 我是否必须实现一个用户类型来包装我想要的每个sql类型 具体说明 或者如何为复合用户类型指定Sql类型 非常感

使用NH2.0,我有一个自定义类型。它由四个属性组成, 所以我实现了
ICompositeUserType

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

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

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

非常感谢。

我建议下载此类挖掘的源代码(NH2.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,它将被实例化为CompositeCostomType类。这消除了同时实现ICompositeUserType和IUserType接口的可能性

现在让我们看看CypTeCuCuthType

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;
}
public覆盖SqlType[]SqlTypes(IMapping映射)
{
IType[]types=userType.PropertyTypes;
SqlType[]结果=新SqlType[GetColumnSpan(映射)];
int n=0;
for(int i=0;i

因此,它接受从PropertyTypes返回的类型,并为每个属性构建SqlType。这意味着为每个属性提供您自己的用户类型包装就可以了。

我找到了解决方案,它非常简单。我必须使用
TypeFactory
创建NHibernate类型:

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

您的意思是,我需要为要指定sql类型的每个属性编写自定义类型。我需要试试这个。实际上我想避免它。谢谢你的回答,但我找到了一个更简单的解决办法。如果你感兴趣,请看我自己的答案。