【问题标题】:NHibernate Bidirectional Many-to-Many Mapping List / BagNHibernate 双向多对多映射列表/包
【发布时间】:2015-11-09 17:09:33
【问题描述】:

我正在努力处理双向多对多映射,其中顺序在一侧很重要,但在另一侧不重要。

我有两个班级:Program 和 Student。

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

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

学生映射

<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,尝试不同的级联选项等。似乎没有任何效果。

帮助!谢谢!

【问题讨论】:

    标签: hibernate nhibernate orm


    【解决方案1】:

    问题可能隐藏在 &lt;list&gt; 映射支持一个实例的多个分配(因此可能有学生 Seth 分配了两次,具有不同的 SequenceIndex - 违反PK错误)

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

    不要使用奇异的关联映射。

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

    我会说,这是(可能是)这种情况,因为您确实需要 Order ...

    【讨论】:

    • 谢谢。这是我最终使用的方法。
    • 很抱歉,没有简单的答案......但我相信这最终会满足您的需求。祝 NHibernate 好运
    • 所以...... nHibernate 并没有真正实现 NxM 关系,实际上暗示这种关系是“不寻常的”?我对 nHibernate 以及它所暗示的所有错误的数据库建模实践感到非常失望。难怪为什么严肃的 DBA 会主动反对 ORM...
    • @GerardoLima 该文档并不表明 N:M 关系很少见,而是它们通常最好表示为两个一对多关系。
    • @giljas 感谢您的评论.. 确实如此...一对多和配对对象与多对一是首选方式...
    猜你喜欢
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多