2011-01-21 12 views
4

とプリミティブ配列を持続んはどのように私は、このエンティティを考えるとNHibernateは

Product (Id) 
Price (ProductId, Order, Price) 

私は、リストを使用するときの差にと困惑しています、バッグ、プリミティブ配列、配列などがあります。プリミティブ配列についてはあまり説明できませんでした。

重要な要件は、配列アイテムを常に同じ順序で格納および取得し、重複する値を含むことがあるということです。

私の質問は、これらの2つのテーブルの間のマッピングはどのように見えるのですか?

+0

私は、理論プログラミングで実際の意味を持つタグ 'primtive'を削除します。 –

+0

削除済み、ありがとう –

+1

プリミティブ= java。 C#でそれは違いはありません – Paco

答えて

3

注文を保存するには、<リスト/ >が必要で、要素(またはエンティティ)の順序を追跡するためのインデックス列を用意します。あなたのニーズに合った要素(単純なタイプ)のリストを持つことができます。

0

価格としてインデックスデータの値が一貫していないことがわかっている場合は、<array>としてマップしてください(すべての商品でインデックスが常に0から始まり、インデックスの穴や商品の重複はありません)。

(そして、より良いdecimal type instead of doubleにあなたの価格を切り替える。)

<class name="Product"> 
    <id name="Id" generator="..." /> 
    <array name="Prices" table="Price"> 
     <key column="ProductId" /> 
     <index column="Order"/> 
     <element type="decimal" length="19" precision="4"> 
      <column name="Price" /> 
     </element> 
    </array> 
</class> 

あなたはFelice's answerで書かれたとしても、代わりにリストを使用しますが、その後、IList<decimal>としてあなたの財産を入力することがあります。

primitive-arrayについては、ちょっと気にする必要はありません。これは、Java Hibernateから継承されたマッピングであり、C#では関連しない概念、プリミティブに対応しています。
これはおそらくPaco's commentの意味でしたが、私は最初に理解していませんでした。これにより確認されたようですNH issue

DB内のインデックスの一貫性を保証できない場合(常に0から始まり、同じ製品のインデックスや重複したインデックスがある可能性があります...)、価格をマッピングするためにモデルを変更する必要があります。<set>子エンティティ(ISet<Price> Prices)の索引を使用して、独自のコードで処理します。 (setマッピングのorder-by="Order"属性でデータを読み込む際の注文部分が処理される可能性があります)
商品の重複価格は、異なるインデックスを扱うためにDB内の別個の行になります。したがって、bagではなくsetを使用するように勧めました。なぜなら、重複した価格は確かに異なるエンティティになるからです。

関連する問題