nhibernate映射多对多:为什么整个包集合被删除并重新插入?

nhibernate映射多对多:为什么整个包集合被删除并重新插入?,nhibernate,many-to-many,bidirectional-relation,Nhibernate,Many To Many,Bidirectional Relation,Nhibernate用户、专业人士、权威人士和开发人员都在期待之中。请帮忙 我想实现两个类之间的n:m关系。一个学生参加更多的课程,一个课程由更多的学生组成。我用bag做了一个双向的多对多关联,从每个站点获取两个列表 两个学生和课程班: public class Student { // Attributes........ [XmlIgnore] public virtual IList MyCourses { get; set; }

Nhibernate用户、专业人士、权威人士和开发人员都在期待之中。请帮忙

我想实现两个类之间的n:m关系。一个学生参加更多的课程,一个课程由更多的学生组成。我用bag做了一个双向的多对多关联,从每个站点获取两个列表

两个学生和课程班:

public class Student {         
     // Attributes........

     [XmlIgnore]
     public virtual IList MyCourses { get; set; }

     // Add Method
     public virtual void AddCourse(Course c)
    {
        if (MyCourses == null)
            MyCourses = new List<Course>();

        if (!MyCourses.Contains(c))
            MyCourses.Add(c);

        if (c.Members== null)
            c.Members= new List<Student>();

        if (!c.Members.Contains(this))
            c.Members.Add(this);
    }

    public virtual void RemoveCourse(Course c)
    {
        if (MyCourses != null)
            MyCourses.Remove(c);

        if (c.Members!= null)
            c.Members.Remove(this);
    }
}

public class Course {         
     // Attributes........

     [XmlIgnore]
     public virtual IList Members { get; set; }
}
工作正常,可以在数据库中找到st1、c1及其关系(st1、c1)。关系数据集是(id=1,st1.id,c1.id)和(id=2,st1.id,c2.id)。 然后,我向对象st1添加更多课程

Course c3 = new Course();
st1.AddCourse(c3);
session.saveOrUpdate(st1);
我可以看到3个关系数据集,但删除了两个旧关系,并使用另一个新id创建了三个新关系。(id=3,st1.id,c1.id),(id=4,st1.id,c2.id)和(id=5,st1.id,c3.id)。关系表中没有id为1和2的数据集

如果我从student.MyCourse中删除课程,然后保存学生对象,则删除也是一样的。还删除了所有集合,并重新创建了一个新列表,其中包含一个已删除的元素。这个问题使得关系表中的id增加得非常快,并且通过备份关系来避免出错

我在互联网、文档和论坛上查阅了几天,想知道为什么所有旧的收藏都被删除了,而每次更改都会产生一个新的收藏,但我没有成功。这是一个来自nhibernate映射的bug,还是我做错了什么

我非常感谢你的帮助和回答

Nhibernate文件

NHibernate无法创建、删除或删除 单独更新行,因为 没有可以用来 标识单个行

只要您在
tr\u StudentCourse
中有
id
,您就可以尝试使用索引集合,即用
或类似内容替换
,并将
元素添加到映射中:

<index
    column="id"
    type="int"
/>


或者甚至为关系表创建一个特殊实体,以便与

一起使用。这是我在NHibernate网站上找到的:

Hibernate正在删除我的整个 收集并重新创建它 更新表的方法

这通常发生在NHibernate时 无法确定更改了哪些项目 收藏中。常见的原因有:

  • 替换持久集合 全新系列 手动传递NHibernate a的实例 构造对象并调用Update 在上面

  • 序列化/反序列化 持久的收集显然也是如此 导致这个问题

    • 更新 使用reverse=“false”-在本例中, NHibernate无法构造SQL以 更新单个集合项目
因此,为了避免出现问题:

传递的集合实例与 你从NHibernate那里得到了什么 (不一定在同一届会议上), 尝试使用其他集合 而不是
), 或者尝试使用reverse=“true”属性 对于

Course c3 = new Course();
st1.AddCourse(c3);
session.saveOrUpdate(st1);
<index
    column="id"
    type="int"
/>