5

一方では順序が重要であるが、他方では重要ではない双方向の多対多マッピングに苦労しています。

Program と Student の 2 つのクラスがあります。

プログラムには多くの学生がいて、順序が重要です。

プログラムA

  1. ジョン
  2. サリー
  3. セス

プログラムB

  1. アレックス
  2. セス
  3. エイミー
  4. ジョン

学生には多くのプログラムがありますが、ここでは順序は重要ではありません。

ジョン * プログラム A * プログラム B

サリー

  • プログラムA

セス

  • プログラムA
  • プログラムB

アレックス

  • プログラムB

エイミー

  • プログラムB

したがって、プログラムと学生の間に双方向の多対多の関連付けがあり、このようなことができるようです...

var john = GetJohn();
var programCount = john.Programs.Count; // 2

var programB = GetProgramB();
var studentCount = programB.Students.Count; // 4
var secondStudent = programB.Students[1]; // Seth

マッピングを機能させる方法がわかりません。PK 違反エラーが発生し続けます。

私は次のことを試しました...

プログラムのマッピング

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Program" table="Programs" lazy="false">
        <id name="ID" column="ID" type="Int32" unsaved-value="0">
            <generator class="identity" />
        </id>
        <property name="Title" column="Title" type="String" length="200" />
        <list name="Students" table="ProgramAssignments" lazy="true" cascade="all">
            <key column="ProgramID" />
            <index column="SequenceIndex" type="Int32" />
            <many-to-many column="StudentID" class="Student" />
        </list>
    </class>
</hibernate-mapping>

生徒のマッピング

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Student" table="Students" lazy="false">
        <id name="ID" column="ID" type="Int32" unsaved-value="0">
            <generator class="identity" />
        </id>
        <property name="Title" column="Title" type="String" length="200" />
        <bag name="Programs" table="ProgramAssignments" lazy="true">
            <key column="StudentID" />
            <many-to-many column="ProgramID" class="Program" />
        </bag>
    </class>
</hibernate-mapping>

私の連想表は非常に単純です...

ProgramID int
StudentID int
SequenceIndex int

PK は ProgramID + StudentID です。

各プログラムは学生の順番が大事なので、ぜひプログラム側で協会を運営してほしいです。しかし、mystudent.Programs を介して特定の学生のプログラムにアクセスできるようにしたいと本当に思っています。プログラム リストで inverse=true を設定したり、さまざまなカスケード オプションを試したりするなど、マッピングのさまざまなバリエーションを試しましたが、何も機能していないようです。

ヘルプ!ありがとう!

4

1 に答える 1

7

<list>この問題は、マッピングが 1 つのインスタンスの複数の割り当てをサポートしているという事実に隠されている可能性があります (したがって、異なるSequenceIndexで 2 回割り当てられた学生Sethが存在する可能性があります- PK エラーに違反しています)。

ですが、ヒントを教えていただきたいです。アプローチを変えて、中間オブジェクトを導入してみてください。NHibernate のドキュメント: Chapter 24. Best Practicesを参照してください。簡単な要約:

エキゾチックな関連付けマッピングを使用しないでください。

実際のmany-to-many関連付けの適切な使用例はまれです。ほとんどの場合、「リンク テーブル」に格納されている追加情報が必要です。この場合、中間リンク クラスに対して 2 つの 1 対多の関連付けを使用することをお勧めします。実際、ほとんどのアソシエーションは 1 対多および多対 1 であると考えられます。他のアソシエーション スタイルを使用する場合は注意が必要であり、それが本当に必要かどうか自問してください。

そして、あなたは本当に注文を必要としているので、これは(そうかもしれませんが)そうです...

于 2013-03-22T06:30:07.127 に答える