【问题标题】:NHibernate multiple primary keys mappingNHibernate 多主键映射
【发布时间】:2015-03-17 13:16:24
【问题描述】:

我有一个名为“Orderrow”的表。 Orderrow 有一个复合主键 (CPK),其中包含以下列:OrderId、ProductId、RowNumber

OrderId 和 ProductId 也是引用表 Order 和 Product 的外键。 RowNumber 在应用程序中生成。

我想知道这是如何在 NHibernate 中映射的,因为我只能设置 1 个 id 元素和 1 个生成器子元素。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    这是一个在 NHibernate 映射文件中使用复合 ID 属性的示例:

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Model">
    
      <class name="Program" table="program">
        <composite-id>
          <key-property name="Id" column="id"></key-property>
          <key-property name="Prog" column="prog"></key-property>
          <key-property name="Site" column="site"></key-property>
        </composite-id>
        <property name="ActiveDate" column="active_date"/>
        <property name="Year" column="year"/>
      </class>
    
    </hibernate-mapping>
    

    【讨论】:

      【解决方案2】:

      您可以在类映射中使用“composite-id”属性来代替“id”属性。但是,您应该知道 nHibernate 团队强烈反对使用它。听起来您正在处理一个遗留数据库,您无法控制其中的模式。因此,“复合 ID”专门针对您的情况。

      查看 NH 文档了解更多信息:http://nhibernate.info/doc/nh/en/index.html

      【讨论】:

      • 我在 NHibernate API ref 中也读到了这一点。但是我没有“遗留”数据库,只是一个用于研究目的的数据库,所以我可以在这里轻松更改 Orderrow 表。那么,表格设计中首选的更好选择是什么?我应该在每行唯一的表 Orderrow 上创建 1 个主键吗?
      【解决方案3】:

      我个人不喜欢在我的数据库表模式中使用复合主键,而且我尝试过的任何 ORM 映射器通常都“难以”处理它们。 如果我必须为表中的一行提供唯一标识(特别是如果它表示业务对象),我更喜欢使用单值代理 Id - GUID 或整数 - 如果表中的任何字段不是'适合。 在编写询问查询和连接时,使用复合 Id 总是很麻烦,所以我通常的策略是使用代理 Id(它对业务对象没有意义,但用于标识对象本身)并在字段上放置唯一约束以前的 CPK。

      【讨论】:

        猜你喜欢
        • 2014-05-26
        • 2011-04-21
        • 2013-03-26
        • 2017-06-28
        • 1970-01-01
        • 2011-05-18
        • 2011-08-08
        • 1970-01-01
        相关资源
        最近更新 更多