私は "Orderrow"というテーブルを持っています。 OrderId、ProductId、RowNumberNHibernateの複数の主キーマッピング
OrderIdとProductIdは、表のOrderとProductを参照する外部キーです。 RowNumberはアプリで生成されます。
これはNHibernateでどのようにマップされているのだろうと思っていたのは、id要素とgenerator要素を1つしか設定できないからです。
私は "Orderrow"というテーブルを持っています。 OrderId、ProductId、RowNumberNHibernateの複数の主キーマッピング
OrderIdとProductIdは、表のOrderとProductを参照する外部キーです。 RowNumberはアプリで生成されます。
これはNHibernateでどのようにマップされているのだろうと思っていたのは、id要素とgenerator要素を1つしか設定できないからです。
'id'プロパティの代わりにクラスマッピングで使用できる 'composite-id'プロパティがあります。しかし、あなたは、nHibernateチームがその使用を強く非難することを知っておくべきです。あなたがスキーマを制御できないレガシーデータベースを扱っているように思えます。ですから、 'composite-id'はあなたの状況に特に適しています。
は、詳細はNHのドキュメントをチェックアウト:http://nhibernate.info/doc/nh/en/index.html
個人的に私は私のデータベーステーブルのスキーマに複合主キーを持つことが好きではない、加えて、彼らは通常、私が試したすべてのORMマッパーによって処理するために「ハード」です。 テーブル内の行に一意のIDを付ける必要がある場合(特にビジネスオブジェクトを表す場合)、テーブル内のいずれかのフィールドがisnでない場合は、単一値のサロゲートId(GUIDまたはInteger)適切ではありません。 質問のクエリと結合を書くときは、複合Idの使用は常に面倒です。私の通常の戦略は、代理Id(ビジネスオブジェクトには意味がありませんが、オブジェクト自体を識別する)を使用し、以前のCPK。ここで
は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>
私もNHibernateはAPI refの中にいることを読みました。しかし、私は "レガシー"データベースを持っていません。研究目的のデータベースなので、ここで簡単にOrderrowテーブルを変更できます。だから、テーブルデザインの中で、より良い選択肢は何ですか?行ごとに一意のOrderrowテーブルに1つの主キーを作成する必要がありますか? –
はい。プライマリのための単一の一意の列が望ましい – NathanD