2009-05-12 10 views
5

私は "Orderrow"というテーブルを持っています。 OrderId、ProductId、RowNumberNHibernateの複数の主キーマッピング

OrderIdとProductIdは、表のOrderとProductを参照する外部キーです。 RowNumberはアプリで生成されます。

これはNHibernateでどのようにマップされているのだろうと思っていたのは、id要素とgenerator要素を1つしか設定できないからです。

答えて

6

'id'プロパティの代わりにクラスマッピングで使用できる 'composite-id'プロパティがあります。しかし、あなたは、nHibernateチームがその使用を強く非難することを知っておくべきです。あなたがスキーマを制御できないレガシーデータベースを扱っているように思えます。ですから、 'composite-id'はあなたの状況に特に適しています。

は、詳細はNHのドキュメントをチェックアウト:http://nhibernate.info/doc/nh/en/index.html

+0

私もNHibernateはAPI refの中にいることを読みました。しかし、私は "レガシー"データベースを持っていません。研究目的のデータベースなので、ここで簡単にOrderrowテーブルを変更できます。だから、テーブルデザインの中で、より良い選択肢は何ですか?行ごとに一意のOrderrowテーブルに1つの主キーを作成する必要がありますか? –

+0

はい。プライマリのための単一の一意の列が望ましい – NathanD

0

個人的に私は私のデータベーステーブルのスキーマに複合主キーを持つことが好きではない、加えて、彼らは通常、私が試したすべてのORMマッパーによって処理するために「ハード」です。 テーブル内の行に一意のIDを付ける必要がある場合(特にビジネスオブジェクトを表す場合)、テーブル内のいずれかのフィールドがisnでない場合は、単一値のサロゲートId(GUIDまたはInteger)適切ではありません。 質問のクエリと結合を書くときは、複合Idの使用は常に面倒です。私の通常の戦略は、代理Id(ビジネスオブジェクトには意味がありませんが、オブジェクト自体を識別する)を使用し、以前のCPK。ここで

9

は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>