2011-10-04 75 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的恆定類型。如果需要,我可以發佈代碼。

這會將限制保存在同一個表中作爲它的持有者