Отображение NHibernate: UserTypes со многими к одному

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

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

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


person theGecko    schedule 09.07.2009    source источник


Ответы (1)


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

ОБНОВЛЕНИЕ

Я решил эту проблему, используя 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;
}

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

person theGecko    schedule 10.07.2009
comment
Просто хотел упомянуть - не добавляйте 2 ответа. Одного достаточно - отредактируйте, если обнаружите что-то новое. :) - person Arnis Lapsa; 10.07.2009
comment
Как странно, что спустя день после вашей публикации я пытаюсь решить ту же самую проблему: тип Money, который имеет Amount и хочет эту ссылку на сущность Currency. Не думаю, что это необычный дизайн. Пошел по тому же пути, что и вы (CompositeUserType), и не понял, как реализовать NullSafeGet (). Ваше решение работает! (Хотя я закончил жесткое кодирование entityName - просто FQTN, например MyNamespace.Currency.) Не уверен, что это лучший способ, но эй, он работает. Спасибо, что нашли время обновить свой пост ответом! - person Nicholas Piasecki; 11.07.2009