2011-10-04 3 views
0

ParsedValue 유형의 두 필드 (낮음, 높음)가있는 개체 (한도)가 있습니다. ParsedValue가 있습니다Fluent NHibernate를 사용하여 구문 분석을 사용하여 두 개의 열을 한 필드에 매핑하십시오.

constructor (double, string); 
method string ToString(); 

각 ParsedValue이있다가 값입니다 : 더블, 단위 : 문자열과 유닛과 일부 성능을 나타냅니다.

나는 필드가있는 테이블을 갖고 싶어 : 그래서

low:double 
high:double 
unit:string 

을 나는 새 ParsedValue (높은 단위) 새로운 ParsedValue (낮은 단위) 및 높은 필드 낮은 필드를 채울 필요가 제한 개체를 선택할 때 . Limit 객체를 데이터베이스에 삽입 할 때 low = Low.Value, high = High.Value, unit = Low.Unit을 삽입해야합니다. Fluent NHibernate를 사용하여 어떻게 할 수 있습니까?

+0

왜 각 값에 대해 열을 만듭니 까? 기존 레거시 스키마를 사용해야합니까? – Brook

+0

그들은 항상 같은 단위를 가지기 때문입니다. – Archeg

+0

제논은 제쳐두고 ... 그럼 왜 유닛을 유지합니까? 나는이 데이터를 문자열로 유지하는 것에 대한 주장을 전혀 이해하지 못한다. – Brook

답변

1

브룩의 의견 확장 : 가정

를 다음 클래스

class LimitHolder 
{ 
    public Limit Limit { get; set; } 
} 

class Limit 
{ 
    public Limit(ParsedValue low, ParsedValue high) 
    { 
     Low = low; 
     High = high; 
    } 

    public virtual ParsedValue Low { get; private set; } 
    public virtual ParsedValue High { get; private set; } 
} 

class ParsedValue 
{ 
    public ParsedValue(double value, string unit) 
    { 
     Value = value; 
     Unit = unit; 
    } 
    public virtual double Value { get; private set; } 
    public virtual string Unit { get; private set; } 
} 

class LimitHolderMap : ClassMap<LimitHolder> 
{ 
    public LimitHolderMap() 
    { 
     Map(lh => lh.Limit).CustomType<LimitUserType>(); 
    } 
} 

class LimitUserType : ImmutableUserType 
{ 
    public object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     var str = (string)NHibernateUtil.String.NullSafeGet(rs, names[0]); 

     if (string.IsNullOrEmpty(str)) 
      return null; 
     else 
     { 
      var splitted = str.Split('|'); 
      return new Limit(
       new ParsedValue(double.Parse(splitted[0]), splitted[2]), 
       new ParsedValue(double.Parse(splitted[1]), splitted[2])); 
     } 
    } 

    public void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     var limit = value as Limit; 
     if (limit == null) 
      NHibernateUtil.String.NullSafeSet(cmd, null, index); 
     else 
     { 
      var str = string.Concat(limit.Low.Value, '|', limit.High.Value, '|', limit.Low.Unit); 
      NHibernateUtil.String.NullSafeSet(cmd, str, index); 
     } 
    } 

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

    public SqlType[] SqlTypes 
    { 
     get { return new [] { SqlTypeFactory.GetString(100) }; } 
    } 
} 

ImmutableUserType는 불변 유형 IUserType 내 구현 매핑. 필요한 경우 코드를 게시 할 수 있습니다.

이 값은 홀더와 동일한 테이블에 한도를 저장합니다.

관련 문제