我正在努力使用雙向多對多映射,其中一方重要,而另一方重要。NHibernate雙向多對多映射列表/包
我有兩個類:程序和學生。
程序中有許多學生,順序很重要。
程序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>
學生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,嘗試不同的級聯選項等。似乎沒有任何工作。
幫助!謝謝!
感謝。這是我最終使用的方法。 – Kevin 2013-03-23 16:32:16
對不起,這不是簡單的答案......但我相信這將做你最後需要的東西。祝你好運NHibernate – 2013-03-23 16:48:00
所以... nHibernate並沒有真正實現NxM關係,並且實際上暗示這種關係是「不尋常」的?我對nHibernate以及它暗示的所有錯誤的數據庫建模實踐感到非常失望。難怪爲什麼嚴肅的數據庫管理員對ORMs提前預防...... – 2015-07-16 10:23:54