2012-12-19 10 views
6

I持って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からstringに変換したり、逆に変換することを考えました。私はそれが全体のポイントだと思う。私はStringToIntTypeがマッピングのためだけだと思った?私はそれをどのように使うべきですか?上記

public Type ReturnedType 

StringToIntTypeを返し、私はそれがint型である必要があり THINK

答えて

5

正しいですか、ReturnedTypeは、NullSafeGetが返す型を返す必要があります。例コードyou linked toが正しくない場合、ReturnedTypetypeof(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); 
    } 
関連する問題