NHibernate双向多对多映射列表/包

时间:2013-03-22 00:49:59

标签: hibernate nhibernate orm

我正在努力进行双向多对多映射,其中订单在一方很重要,而另一方则不重要。

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

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

计划A

  1. 约翰
  2. 萨利
  3. 赛斯
  4. 计划B

    1. 亚历
    2. 赛斯
    3. 艾米
    4. 约翰
    5. 学生有很多课程,但这里的顺序并不重要。

      约翰 *计划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,尝试不同的级联选项等。似乎没什么用。

      帮助!谢谢!

1 个答案:

答案 0 :(得分:7)

问题可能隐藏在这样一个事实中:<list>映射支持一个实例的多个赋值(因此可能会有学生 Seth 分配两次,具有不同的 SequenceIndex < / em> - 违反PK错误)

但我想给你一个提示。尝试更改方法并引入中间对象。请参阅NHibernate文档:Chapter 24. Best Practices。快速摘要:

  

不要使用异国情调的关联映射。

     

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

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