首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate: IUserType不工作

NHibernate: IUserType不工作
EN

Stack Overflow用户
提问于 2012-12-20 00:07:34
回答 2查看 2.3K关注 0票数 6

我有一个实现IUserType的类:

代码语言:javascript
复制
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();
        }
    }

我的映射:

代码语言:javascript
复制
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'");
        }

我的属性:

代码语言:javascript
复制
    public virtual int ula { get; set; }
    public virtual String bezeichnung { get; set; }
    public virtual Int32? sprache { get; set; }
    public virtual String la { get; set; }

问题:当我这样做的时候

代码语言:javascript
复制
var b = session.Get<BarausLang>(5);

上面写着

代码语言:javascript
复制
{NHibernate.TypeMismatchException: Provided id of the wrong type.
Expected: MobileServiceServer.Models.StringToIntType, got System.Int32

有什么问题吗?我认为nHibernate会隐式地调用StringToIntType来将整数转换为字符串,反之亦然。我想这就是问题的关键。我以为StringToIntType只用于映射?那我该怎么用呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-20 01:09:42

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

另外,正确地使用Equals方法是非常重要的,我建议对您的代码做一点小小的修改:

代码语言:javascript
复制
    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);
    }
票数 5
EN

Stack Overflow用户

发布于 2012-12-20 00:24:14

I可能已经发现了问题:

代码语言:javascript
复制
public Type ReturnedType

上面返回的是StringToIntType,我认为应该是int。

但是,在:

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

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

请确认。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13956408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档