NHibernate:IUserType无效

时间:2012-12-19 16:07:34

标签: nhibernate fluent usertype

我有这个实现IUserType的类:

public class StringToIntType : IUserType
    {
        /// <summary>
        /// mutable object = an object whose state CAN be modified after it is created
        /// </summary>
        public bool IsMutable
        {
            get { return false; }
        }

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

        public SqlType[] SqlTypes
        {
            get { return new[] { NHibernateUtil.String.SqlType }; }
        }

        public object NullSafeGet(IDataReader rs, string[] names, object owner)
        {
            var obj = NHibernateUtil.String.NullSafeGet(rs, names[0]);

            if (obj == null) return null;

            var s = (string)obj;

            int i;
            if (Int32.TryParse(s, out i))
                return i;
            return -1;
        }

        public void NullSafeSet(IDbCommand cmd, object value, int index)
        {
            if (value == null)
            {
                ((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value;
            }
            else
            {
                var i = (int)value;
                ((IDataParameter)cmd.Parameters[index]).Value = i.ToString();
            }
        }

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

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

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

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

        public new bool Equals(object x, object y)
        {
            if (ReferenceEquals(x, y)) return true;

            if (x == null || y == null) return false;

            return x.Equals(y);
        }

        public int GetHashCode(object x)
        {
            return x == null ? typeof(int).GetHashCode() + 473 : x.GetHashCode();
        }
    }

我的映射:

public BarausLangMap()
        {
            Table("BARAUSLANG");

            Id(x => x.ula).CustomType<StringToIntType>();

            Map(x => x.bezeichnung);
            Map(x => x.sprache);
            Map(x => x.la);
            Where("la = 'SPE'");
        }

我的属性:

    public virtual int ula { get; set; }
    public virtual String bezeichnung { get; set; }
    public virtual Int32? sprache { get; set; }
    public virtual String la { get; set; }

问题:我什么时候

var b = session.Get<BarausLang>(5);

它说

{NHibernate.TypeMismatchException: Provided id of the wrong type.
Expected: MobileServiceServer.Models.StringToIntType, got System.Int32

有什么问题?我认为nHibernate会隐式地调用StringToIntType来从int转换为string,反之亦然。我认为这是重点。我以为StringToIntType只用于映射?那我该怎么用呢?

2 个答案:

答案 0 :(得分:5)

你是对的,ReturnedType应该返回NullSafeGet将返回的类型。示例代码you linked to不正确,ReturnedType应返回typeof(bool)

此外,正确使用Equals方法非常重要,我建议您对代码进行一些小改动:

    public new bool Equals(object x, object y)
    {
        if (ReferenceEquals(x, y)) return true;

        var xString = x as string;
        var yString = y as string;
        if (xString == null || yString == null) return false;

        return xString.Equals(yString);
    }

答案 1 :(得分:1)

MAY 发现了问题:

public Type ReturnedType
上面的

返回StringToIntType,而我 THINK 它应该是int。

然而,在:

http://lostechies.com/rayhouston/2008/03/23/mapping-strings-to-booleans-using-nhibernate-s-iusertype/

该方法返回实现IUserType的类型。

确认