开发者

How can I map a UInt64 field to a decimal(20, 0) column using Fluent nHibernate?

开发者 https://www.devze.com 2023-04-06 10:53 出处:网络
I\'m using MS SQL Server 2008R2 Fluent nHibernate 1.3 nHibernate 3.2 I have a UInt64 field in my domain that potentially takes up the entire UInt64 range. Since MS-SQL doesn\'t support unsigned in

I'm using

  • MS SQL Server 2008R2
  • Fluent nHibernate 1.3
  • nHibernate 3.2

I have a UInt64 field in my domain that potentially takes up the entire UInt64 range. Since MS-SQL doesn't support unsigned integers 开发者_开发技巧we decided to store it in a decimal(20,0) column (at least for now). I've tried using CustomSqlType("decimal(20, 0)") on that column in my mappings but I'm still getting an error when I try to access that field that says the database doesn't support UInt64.

How can I map a UInt64 field to a decimal(20, 0) column using Fluent nHibernate?

I've tried

  • CustomSqlType("Decimal").Precision(20).Scale(0)
  • CustomSqlType("decimal(20, 0)")
  • CustomType() and the permutations of CustomSqlType and CustomType.

Edit The error it gives is "No mapping exists from DbType UInt64 to a known SqlDbType."

Edit 2 This works for the write side but breaks with an Invalid cast when values are read back out

.CustomSqlType("decimal").Precision(20).Scale(0)
.CustomType<NHibernate.Type.DoubleType>()


i would go with a user type

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>()

Edit: sorry forgot to note. i have a lot of usertypes so i implemented my own baseclasses

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; }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消