Orm 如何使用Fluent nHibernate将UInt64字段映射到十进制(20,0)列?

Orm 如何使用Fluent nHibernate将UInt64字段映射到十进制(20,0)列?,orm,fluent-nhibernate,nhibernate-mapping,sql-server-2008-r2,Orm,Fluent Nhibernate,Nhibernate Mapping,Sql Server 2008 R2,我正在使用 MS SQL Server 2008R2 Fluent nHibernate 1.3 nHibernate 3.2 我的域中有一个UInt64字段,可能会占用整个UInt64范围。由于MS-SQL不支持无符号整数,我们决定将其存储在十进制(20,0)列中(至少目前是这样)。我曾尝试在映射中的该列上使用CustomSqlType(“decimal(20,0)”),但当我尝试访问表示数据库不支持UInt64的字段时,仍然会遇到错误 如何使用Fluent nHibernate将UInt

我正在使用

  • MS SQL Server 2008R2
  • Fluent nHibernate 1.3
  • nHibernate 3.2
我的域中有一个UInt64字段,可能会占用整个UInt64范围。由于MS-SQL不支持无符号整数,我们决定将其存储在
十进制(20,0)
列中(至少目前是这样)。我曾尝试在映射中的该列上使用
CustomSqlType(“decimal(20,0)”)
,但当我尝试访问表示数据库不支持UInt64的字段时,仍然会遇到错误

如何使用Fluent nHibernate将UInt64字段映射到十进制(20,0)列

我试过了

  • CustomSqlType(“十进制”).精度(20).刻度(0)
  • CustomSqlType(“十进制(20,0)”)
  • 自定义类型() 以及CustomSqlType和CustomType的排列
编辑 它给出的错误是“不存在从DbType UInt64到已知SqlDbType的映射。”

编辑2 这适用于写端,但在读取回值时会中断无效转换

.CustomSqlType("decimal").Precision(20).Scale(0)
.CustomType<NHibernate.Type.DoubleType>()
.CustomSqlType(“十进制”).精度(20).刻度(0)
.CustomType()

我会选择用户类型

class UInt64UserType : ImmutableUserType
{
    public object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        var value = NHibernateUtil.Decimal.NullSafeGet(rs, names[0]);
        return (value == null) ? 0 : Convert.ToUInt64(value);
    }

    public void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        decimal d = Convert.ToDecimal(value);
        NHibernateUtil.Decimal.NullSafeSet(cmd, d, index);
    }

    public Type ReturnedType
    {
        get { return typeof(UInt64); }
    }

    public SqlType[] SqlTypes
    {
        get { return new[] { SqlTypeFactory.Decimal }; }
    }
}


.CustomType<UInt64UserType>()

ImmutableUserType在哪个dll或命名空间中?我在NHibernate中看不到它。用户类型和我的谷歌技能让我失望。
public abstract class ImmutableUserType : UserTypeBase
{
    public override bool IsMutable
    {
        get { return false; }
    }

    public override object DeepCopy(object value)
    {
        return value;
    }

    public override object Replace(object original, object target, object owner)
    {
        return original;
    }

    public override object Assemble(object cached, object owner)
    {
        return cached;
    }

    public override object Disassemble(object value)
    {
        return value;
    }
}

public abstract class UserTypeBase : IUserType
{
    public new virtual bool Equals(object x, object y)
    {
        return EqualsHelper.Equals(x, y);
    }

    public virtual int GetHashCode(object x)
    {
        return (x == null) ? 0 : x.GetHashCode();
    }

    public abstract object Assemble(object cached, object owner);

    public abstract object DeepCopy(object value);

    public abstract object Disassemble(object value);

    public abstract bool IsMutable { get; }

    public abstract object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner);

    public abstract void NullSafeSet(System.Data.IDbCommand cmd, object value, int index);

    public abstract object Replace(object original, object target, object owner);

    public abstract Type ReturnedType { get; }

    public abstract SqlType[] SqlTypes { get; }
}