NHibernate多个主键映射

时间:2009-05-12 14:12:45

标签: nhibernate

我有一张叫做“Orderrow”的桌子。 Orderrow有一个复合主键(CPK),其中包含以下列:OrderId,ProductId,RowNumber

OrderId和ProductId也是指向订单和产品表的外键。 RowNumber在应用程序中生成。

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

3 个答案:

答案 0 :(得分:9)

以下是在NHibernate映射文件中使用composite-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>

答案 1 :(得分:6)

您可以在类映射中使用'composite-id'属性,而不是'id'属性。但是,您应该知道nHibernate团队强烈反对使用它。听起来您正在处理遗留数据库,在该数据库中您无法控制架构。因此,'composite-id'专门针对您的情况。

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

答案 2 :(得分:0)

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