2012-12-19 26 views
6

我有这个类实现IUserType:NHibernate的: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转换为字符串,反之亦然。我认为这是重点。我以为StringToIntType仅用于映射?那么我应该如何使用它?

回答

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); 
    } 
相关问题