브룩의 의견 확장 : 가정
를 다음 클래스
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 내 구현 매핑. 필요한 경우 코드를 게시 할 수 있습니다.
이 값은 홀더와 동일한 테이블에 한도를 저장합니다.
왜 각 값에 대해 열을 만듭니 까? 기존 레거시 스키마를 사용해야합니까? – Brook
그들은 항상 같은 단위를 가지기 때문입니다. – Archeg
제논은 제쳐두고 ... 그럼 왜 유닛을 유지합니까? 나는이 데이터를 문자열로 유지하는 것에 대한 주장을 전혀 이해하지 못한다. – Brook