我正在努力进行双向多对多映射,其中顺序在一侧很重要,而在另一侧则不重要。
我有两节课:程序和学生。
一个程序有很多学生,顺序很重要。
程序A
程式B
一个学生有很多程序,但是顺序在这里并不重要。
John 程序A 程序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,尝试使用不同的级联选项等。似乎没有任何效果。
帮帮我!谢谢!
问题可能隐藏在以下事实中:<list>映射支持对一个实例的多次分配(因此,可能 会给 学生 Seth 分配两次,但具有不同的 SequenceIndex- 违反了PK错误)
<list>
但我想给你一个提示。尝试改变方法并引入中间对象。请参阅NHibernate文档:第24章。快速总结:
不要使用奇异的关联映射。 真正many-to- many关联的良好用例很少见。大多数时候,您需要存储在“链接表”中的其他信息。在这种情况下,最好将两个一对多关联用于中间链接类。实际上,我们认为大多数关联是一对多和多对一的,在使用任何其他关联样式时应格外小心,并问自己是否真的必要。
不要使用奇异的关联映射。
真正many-to- many关联的良好用例很少见。大多数时候,您需要存储在“链接表”中的其他信息。在这种情况下,最好将两个一对多关联用于中间链接类。实际上,我们认为大多数关联是一对多和多对一的,在使用任何其他关联样式时应格外小心,并问自己是否真的必要。
many-to- many
我想说的是(可能),因为您确实需要 订单 …