Сопоставление NHibernate:UserTypes со связью «многие к одному»
-
12-09-2019 - |
Вопрос
Впервые знаком с NHibernate и изучаю его, поскольку мы модифицируем существующее решение для использования этого ORM.В идеале структура хранения и классы объектов должны оставаться прежними, поэтому я столкнулся с одной или двумя проблемами сопоставления.
Один класс «Деньги» имеет стоимость и валюту.Значение имеет двойное значение, а валюта является внешним ключом для таблицы списка валют.
Деньги могут отображаться как тип во многих объектах/таблицах, поэтому я создал CompositeUserType, чтобы сопоставить его вместе со стандартным сопоставлением с валютой.Это работает нормально, но хоть убей, я не могу получить отношение валюты к ленивой загрузке из NHibernate.Мы используем Fluent, но будем рады любым подсказкам в HBM.
Решение
Похоже, мне нужно использовать компоненты, но я не вижу, как добавлять ссылки из них или CompositeUserTypes:/
https://forum.hibernate.org/viewtopic.php?f=1&t=947719&start=0
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;
}
Не уверен, что это рекомендуемый способ, но он работает :)