地图使用与功能NHibernate
问题描述:
解析我有一个对象(限制),其中包含两个字段(低,高)型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?
答
延长布鲁克的评论:
假设下面的类
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的恒定类型。如果需要,我可以发布代码。
这会将限制保存在同一个表中作为它的持有者
为什么不为每个值创建列?你是否*使用现有的遗留模式? – *
这是因为他们将始终拥有相同的单位。 – Archeg
抛开非sequiturs ...那么为什么甚至坚持单位?我不明白坚持把这些数据作为一个字符串存在。 – *