在NHibernate中映射复杂的引用

时间:2009-06-15 02:25:55

标签: nhibernate fluent-nhibernate mapping

我正在尝试在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中找出它。另外,鉴于我正在使用的遗留数据库中充满了像这样的链,是否有最佳实践建议?

1 个答案:

答案 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支持。这可能是一个可行的第三种选择。