2011-10-04 96 views
0

解析我有一个对象(限制),其中包含两个字段(低,高)型ParsedValue两列一个字段。 ParsedValue具有:地图使用与功能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

抛开非sequiturs ...那么为什么甚至坚持单位?我不明白坚持把这些数据作为一个字符串存在。 – 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的恒定类型。如果需要,我可以发布代码。

这会将限制保存在同一个表中作为它的持有者