NHibernate双向多对多映射列表/包

Kev*_*vin 4 nhibernate orm hibernate

我正在努力进行双向多对多映射,其中订单在一方很重要,而另一方则不重要.

我有两个班:课程和学生.

一个程序有很多学生,顺序很重要.

计划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
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何使映射工作.我一直得到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>
Run Code Online (Sandbox Code Playgroud)

学生映射

<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>
Run Code Online (Sandbox Code Playgroud)

我的关联表非常简单......

ProgramID int
StudentID int
SequenceIndex int
Run Code Online (Sandbox Code Playgroud)

PK是ProgramID + StudentID.

我真的希望从程序端管理关联,因为每个程序中学生的顺序很重要.但是,我真的希望能够通过mystudent.Programs访问特定学生的程序.我已经尝试了许多映射的变体,包括在程序列表上设置inverse = true,尝试不同的级联选项等等.似乎没有什么工作.

救命!谢谢!

Rad*_*ler 7

这个问题可能隐藏在这样一个事实中:<list>映射支持一个实例的多个赋值(因此可能会有学生Seth分配两次,具有不同的SequenceIndex - 违反PK错误)

但我想给你一个提示.尝试更改方法并引入中间对象.请参阅NHibernate文档:第24章最佳实践.快速摘要:

不要使用异国情调的关联映射.

用于真实many-to-many关联的良好用途是罕见的.大多数情况下,您需要存储在"链接表"中的其他信息.在这种情况下,使用两个一对多关联到中间链接类要好得多.事实上,我们认为大多数协会都是一对多和多对一,你在使用任何其他协会风格时应该小心,并问自己是否真的有必要.

我会说,这是(可能)的情况,因为你真的需要订单 ......