2

マッピングによってオブジェクトのコレクションを親オブジェクトに取得しようとしています。

主キーがguid(Id)である親オブジェクト「ScoreCard」と、主キーがguid(Id)である子「Score」オブジェクトがあります。両方のオブジェクトが持っている 2 つのフィールドに基づいて親の子オブジェクトを選択したいのですが、それを機能させることができません。マッピングは次のとおりです。

<bag name="ScoreCard">
  <key>
    <column name="HoleId"/>
    <column name="PlayerId"/>
  </key>
  <one-to-many class="Score" not-found="ignore"/>
</bag>

私はデータベースを設計しませんでしたが、ScoreCard オブジェクトは、必要な列と悪の GUID の両方を返すビューから取得されます。私が何を試しても、NHibernate は外部キーが主キーと同じではないという例外をスローし続けます。

これは私には最も単純な要件のように思えます.いくつかの基準を与えられたもののコレクションを取得します.なぜ私はそんなに行き詰まっているのですか?

お手数おかけしますが、サンプルコードが悪くてすみません(親戚の家でサブリミナルゴルフ観戦)。

4

2 に答える 2

3

うーん、やっと見つけました。親オブジェクトは、3 つの列を指定し、キーを指定しないビューから描画されます。コードを調べたときに見つけた悪の GUID の代わりに、HoleId と PlayerId に複合キーをマップできます。必要な Score オブジェクトを簡単にマップし、NHibernateUtil.Initialize を使用してそれらを遅延読み込みできるので、これは素晴らしいことです。

マッピング xml は次のようにする必要があります

<class name="ParentObject">
    <composite-id>
      <key-property name="HoleId" column="HoleId" />
      <key-property name="PlayerId" column="PlayerId" />      
    </composite-id>
    <property name="EvilGuid" column="Id" />
    <bag name="ScoreCard">
      <key>
        <column name="HoleId"/>
       <column name="PlayerId"/>
      </key>  
      <one-to-many class="Score" not-found="ignore"/>
    </bag>
</class>

私はこの投稿からインスピレーションを得ました。Stefan の回答にも注意してください。ここで幸運な休憩があったと感じているので、DDD についてもっと考えて設計を改善することができます。

ご協力いただきありがとうございます。

于 2009-04-22T09:58:03.460 に答える
1

問題は次のとおりです。NHibernate は DDD に最適です (ただし、DDD だけではありません)。これは、最初にドメイン クラスを作成し、データベースをドメイン モデルに最適に適合させることを意味します。

非主キー フィールドとの複合 ID 関係があります。ですから、NHibernate がそれに対処できることを祈り始めてください。非主キーによる複合 ID と関係の両方がサポートされています (従来のデータベースの場合)。通常、DDD では推奨されません。

両方の組み合わせはうまくいかないと思います。NHibernates イシュー トラッカー ( https://nhibernate.jira.com/browse/NH-1722 ) でこのイシューを参照してください。そこで機能に投票できます。

于 2009-04-21T22:10:34.473 に答える