Сопоставить два столбца с одним полем, используя синтаксический анализ с помощью Fluent NHibernate - PullRequest
0 голосов
/ 04 октября 2011

У меня есть объект (Limit), который содержит два поля (Low, High) с типом ParsedValue.ParsedValue имеет:

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

Каждое ParsedValue имеет свое значение: double и unit: string и представляет некоторое измерение с единицей измерения.

Я хочу иметь таблицу с полями:

low:double
high:double
unit:string

Таким образом, при выборе объекта Limit мне нужно заполнить поле Low новым ParsedValue (низкий, единица измерения), а High - новым ParsedValue (высокое значение, единица измерения).При вставке объекта Limit в базу данных он должен вставить low = Low.Value, high = High.Value, unit = Low.Unit

Как это сделать с помощью Fluent NHibernate?

1 Ответ

1 голос
/ 04 октября 2011

расширение комментария Брука:

в предположении следующих классов

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 для неизменяемых типов.При необходимости я могу опубликовать код.

это сохранит лимит в той же таблице, что и его владелец

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...