我正在努力处理双向多对多映射,其中顺序在一侧很重要,但在另一侧不重要。
我有两个课程:程序和学生。
一个项目有很多学生,顺序很重要。
程序 A
- 约翰
- 莎莉
- 赛斯
方案 B
- 亚历克斯
- 赛斯
- 艾米
- 约翰
一个学生有很多程序,但顺序在这里并不重要。
约翰 * 程序 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,尝试不同的级联选项等。似乎没有任何效果。
帮助!谢谢!