5

我正在努力处理双向多对多映射,其中顺序在一侧很重要,但在另一侧不重要。

我有两个课程:程序和学生。

一个项目有很多学生,顺序很重要。

程序 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>映射支持一个实例的多个分配(因此可能有学生Seth分配了两次,具有不同的SequenceIndex - 违反了 PK 错误)

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

不要使用奇异的关联映射。

真正many-to-many关联的好用例很少见。大多数时候,您需要存储在“链接表”中的附加信息。在这种情况下,最好使用两个一对多关联到一个中间链接类。事实上,我们认为大多数关联都是一对多和多对一的,在使用任何其他关联方式时要小心,并问问自己是否真的有必要。

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

于 2013-03-22T06:30:07.127 回答