Отображение сложных ссылок в NHibernate - PullRequest
0 голосов
/ 15 июня 2009

Я пытаюсь построить следующую ассоциацию в NHibernate (базовый класс Entity содержит свойство Id, оно и атрибуты взяты из S # arp Architecture)

public class Terminal : Entity {
    public virtual string Name { get; set; }
}
public class Order : Entity {
    [NotNull]
    public virtual Terminal Terminal { get; set; }
}

Где данные о заказе хранятся в ORDERS, а данные о терминалах - в таблицах TERMINALS. Проблема в том, что нет прямой связи между двумя таблицами. Если бы у меня был идентификатор для ORDERS.ORDER_ID, я бы выбрал соответствующую строку TERMINALS со следующим SQL.

select t.* 
from ORDERS o 
     inner join cust_prod cp on (o.CUST_PROD_ID = cp.CUST_PROD_ID)
     inner join customer_terminal ct on (cp.CUSTOMER_TERMINAL_ID = ct.CUSTOMER_TERMINAL_ID)
     inner join terminal t on (ct.TERMINAL_ID = t.TERMINAL_ID)
where o.ORDER_ID = :p_order_id

Как мне отобразить это в NHibernate? Предпочтительно, как мне отобразить это в Fluent NHibernate, но я думаю, что я мог бы понять это из XML. Кроме того, учитывая, что унаследованная база данных, с которой я работаю, переполнена подобными цепочками, есть ли какие-либо рекомендации по передовому опыту?

1 Ответ

1 голос
/ 16 июня 2009

Я уверен, что ваши варианты будут:

1) Сопоставление с необработанным SQL (посмотрите определение документа NHibernate для sql-запроса: nh docs ) .. Раздел об отображении обновлений / вставок находится сразу после.

2) Или, по крайней мере, введите по крайней мере сущности в середине для обработки удержания отношений в cust_prod и customer_terminal. Если в этих таблицах используются составные ключи для PK, вам нужно посмотреть, как сопоставить составной-идентификатор и ключ-многие-к-одному.

Во втором варианте вы затем сопоставляете один-к-одному (или двунаправленное множество-один) для объединяемых объектов.

3) Я не смотрел на сохраненные процы вечно, но я считаю, что в NH 2.0+ появилась лучшая поддержка sproc. Это может быть приемлемым третьим вариантом.

...