nhibernate映射多对多:为什么整个包集合被删除并重新插入?
Nhibernate用户、专业人士、权威人士和开发人员都在期待之中。请帮忙 我想实现两个类之间的n:m关系。一个学生参加更多的课程,一个课程由更多的学生组成。我用bag做了一个双向的多对多关联,从每个站点获取两个列表 两个学生和课程班: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; }
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以 更新单个集合项目
(
或
),
或者尝试使用reverse=“true”属性
对于
Course c3 = new Course();
st1.AddCourse(c3);
session.saveOrUpdate(st1);
<index
column="id"
type="int"
/>