我正在尝试在NHibernate中构建以下关联(基本Entity类包含Id属性,它和属性来自S#arp架构)
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的id,我将使用以下SQL获取相应的TERMINALS行。
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中找出它。另外,鉴于我正在使用的遗留数据库中充满了像这样的链,是否有最佳实践建议?
答案 0 :(得分:1)
我很确定您的选择是:
1)针对原始SQL映射(查看sql-query的NHibernate doc定义:nh docs)..关于映射更新/插入的部分就在之后。
2)或者,至少引入中间的实体来处理在cust_prod和customer_terminal中保存关系。如果这些表使用PK的复合键,那么您将需要查看如何映射composite-id和key-many-to-one。
在第二个选项中,您可以在连接实体上映射一对一(或双向多对)。
3)我没有永远看过存储过程,但我相信NH 2.0+引入了更好的sproc支持。这可能是一个可行的第三种选择。