2013-03-22 46 views
4

我正在努力使用雙向多對多映射,其中一方重要,而另一方重要。NHibernate雙向多對多映射列表/包

我有兩個類:程序和學生。

程序中有許多學生,順序很重要。

程序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> 

學生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,嘗試不同的級聯選項等。似乎沒有任何工作。

幫助!謝謝!

回答

7

的問題可以被隱藏的事實,即<list>映射支持一個實例的多個任務(所以有可能是學生賽斯分配兩次,用不同的SequenceIndex - 違反PK錯誤)

但我想給你一個提示。嘗試改變方法並引入中間對象。查看NHibernate文檔:Chapter 24. Best Practices。快速總結:

不要使用外來的關聯映射。

良好的使用案例真正的many-to-many協會是罕見的。當你需要額外的信息存儲在「鏈接表」中時,大部分是 。 在這種情況下,使用兩個一對多關聯到 中間鏈接類更好。事實上,我們認爲大多數協會 是一對多和多對一的,您在使用任何其他關聯風格時應該小心,並問問自己是否真的需要。

而且我要說,這是(可能是)的情況下,因爲你真的需要訂單 ...

+0

感謝。這是我最終使用的方法。 – Kevin 2013-03-23 16:32:16

+0

對不起,這不是簡單的答案......但我相信這將做你最後需要的東西。祝你好運NHibernate – 2013-03-23 16:48:00

+0

所以... nHibernate並沒有真正實現NxM關係,並且實際上暗示這種關係是「不尋常」的?我對nHibernate以及它暗示的所有錯誤的數據庫建模實踐感到非常失望。難怪爲什麼嚴肅的數據庫管理員對ORMs提前預防...... – 2015-07-16 10:23:54