Отображение NHibernate: пользовательские типы со многими к одному - PullRequest
2 голосов
/ 09 июля 2009

Новое в NHibernate и его изучение, поскольку мы модифицируем существующее решение для использования этого ORM. В идеале структура хранения и классы объектов должны оставаться неизменными, поэтому я столкнулся с одной или двумя проблемами отображения.

Один класс «Деньги» имеет значение и валюту. Значение является двойным, а валюта является внешним ключом для таблицы списка валют.

Деньги могут отображаться в виде шрифта на многих объектах / таблицах, поэтому я создал CompositeUserType, чтобы сопоставить его со стандартным сопоставлением с валютой. Это прекрасно работает, но на всю жизнь я не могу получить отношение валюты к ленивой нагрузке от NHibernate. Мы свободно говорим, но рады любым указателям в hbm.

1 Ответ

4 голосов
/ 10 июля 2009

Похоже, мне нужно использовать компоненты, но я не вижу, как добавить ссылки из этих или CompositeUserTypes, хотя: /

https://forum.hibernate.org/viewtopic.php?f=1&t=947719&start=0

https://web.archive.org/web/20090227235136/http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/08/13/a-fluent-interface-to-nhibernate---part-2---value.aspx

http://wiki.fluentnhibernate.org/show/StandardMappingComponents

UPDATE

Я обошел эту проблему, используя CompositeUserType и настройку конечной точки прокси на объекте, который вызывает метод NullSafeGet ():

public virtual object NullSafeGet(IDataReader dr, string[] names, ISessionImplementor session, object owner)
{
    if (dr == null)
    {
        return null;
    }

    Money value = new Money()
    {
        Value = (double)NHibernateUtil.Double.NullSafeGet(dr, names[0], session, owner)
    };

    string entityName = session.BestGuessEntityName(value.Currency);
    value.Currency = (CurrencyDetails)session.InternalLoad(entityName, (object)DEFAULT_CURRENCY_ID, false, false);

    return value;
}

Не уверен, что это рекомендуемый способ, но он работает:)

...