【问题标题】:Mapping complicated references in NHibernate在 NHibernate 中映射复杂的引用
【发布时间】:2009-06-16 21:37:36
【问题描述】:

我正在尝试在 NHibernate 中构建以下关联(基础实体类包含一个 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 中找出它。此外,鉴于我正在使用的旧数据库充满了这样的链,有什么最佳实践建议吗?

【问题讨论】:

  • 客户和订单类别是什么?
  • 我不明白你的意思。我给出了订单类的完整描述,虽然我有一个客户类,但它的存在与手头的问题是正交的。
  • 我看不到你想对内部连接 ​​cust_prod cp on (o.CUST_PROD_ID = cp.CUST_PROD_ID) 和 customer_terminal ct on (cp.CUSTOMER_TERMINAL_ID = ct.CUSTOMER_TERMINAL_ID) 做什么
  • 我正在尝试让订单引用终端。然而,数据库的标准化很差,并且给定一个 Order.id 代替 :p_order_id 查询是我在终端上获取信息的方式。
  • 无法在未映射的表上查询 nhibernate。我猜你可以创建一个普通的 sql 查询或规范化数据库

标签: nhibernate fluent-nhibernate mapping


【解决方案1】:

我很确定您的选择是:

1) 针对原始 SQL 进行映射(查看 sql-query 的 NHibernate 文档定义:nh docs)。紧随其后的是映射更新/插入部分。

2) 或者,至少在中间引入实体来处理保持 cust_prod 和 customer_terminal 中的关系。如果这些表对 PK 使用复合键,那么您将需要了解如何映射复合 ID 和键多对一。

在第二个选项中,您将在连接实体上映射一对一(或双向多一)。

3) 我从来没有看过存储过程,但我相信 NH 2.0+ 引入了更好的存储过程支持。这可能是一个可行的第三种选择。

【讨论】:

    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多