Картографиране на NHibernate: UserTypes с много към едно

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

Един клас „Пари“ има стойност и валута. Стойността е двойна и валутата е външен ключ към таблица със списък на валутите.

Парите могат да се появят като тип на много обекти/таблици, така че създадох CompositeUserType, за да го картографирам заедно със стандартно картографиране към валута. Това работи добре, но за живота си не мога да накарам валутната връзка за мързеливо зареждане от NHibernate. Ние използваме fluent, но се радваме на всякакви насоки в 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, който има сума и иска тази препратка към единица валута. Не мисля, че е необичаен дизайн. Минахме по същия път, по който направихте (CompositeUserType) и се затрудних как да приложа NullSafeGet(). Вашето решение работи! (Въпреки че в крайна сметка кодирах твърдо entityName -- само FQTN като MyNamespace.Currency.) Не съм сигурен дали и това е най-добрият начин, но хей, работи. Благодаря, че отделихте време да актуализирате публикацията си с отговор! - person Nicholas Piasecki; 11.07.2009