我想在Nhibernate中建立一个多对多的关系,但我现在卡住了,我有3个sql表,学生类和学生类关系,我已经用c#写了2个类。
class Student
{
public virtual int StudentID { get; set; }
public virtual string name { get; set; }
public virtual IList<Class> Classes { get; set; }
public virtual void AddClass(Class Classer) {
Classes.Add(Classer);
}
}
'''
class Class
{
public virtual int ClassID { get; set; }
public virtual string name { get; set; }
public virtual string teacher { get; set; }
public virtual List<Student> students { get; set; }
public virtual void AddStudent(Student stud) {
students.Add(stud);
}
}我的xml文件是这样的,另一个是一样的。
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NHibernateTutorialPart1"
namespace="NHibernateTutorialPart1">
<class name="Student">
<id name="StudentID" column="StudentID" >
</id>
<property name="name" />
<bag name ="Classes" table="ClassStudentRelation" cascade ="all" inverse ="true" >
<key column="ClassID"></key>
<many-to-many class="Class"> </many-to-many>
</bag>
</class>
</hibernate-mapping>在我的main中,我创建了这个对象
Student sven= new Student {StudentID=7, name = "sven" };
Class Ai = new Class {ClassID=7, name = "AI", teacher = "lauer" };
List<Class> tmp = new List<Class>();
List<Student> save = new List<Student>();
save.Add(sven);
tmp.Add(Ai);
Student sven2= new Student { StudentID = 62, name = "sven2",Classes=tmp };
Class Ai2 = new Class { ClassID = 62, name = "AI2", teacher = "lauer2",students=save };
mySession.Save(sven2);
mySession.Save(Ai2);
mySession.Transaction.Commit();如果我提交没有sven和ai没有列表,我能够提交的信息在正确的sql tabel,但我想提交ai2和sven2与其他的列表,我得到的信息到3个表,但这工作有人知道如何修复它。错误是与不匹配
NHibernate.Collection.Generic.PersistentGenericBag and NHibernate.Collection.Generic.PersistentGenericList发布于 2021-07-22 21:46:05
类包映射存在问题。假设ClassStudentRelation连接表具有StudentID和ClassID外键。映射应为:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NHibernateTutorialPart1"
namespace="NHibernateTutorialPart1">
<class name="Student">
<id name="StudentID" column="StudentID" >
</id>
<property name="name" />
<bag name="Classes" table="ClassStudentRelation" cascade="all" inverse="false">
<key column="StudentID"></key>
<many-to-many class="Class" column="ClassID" />
</bag>
</class>
</hibernate-mapping>inverse属性应设置为false,因为集合负责管理关系。
Class对象的映射如下所示:
<class name="Class">
<id name="ClassID" column="ClassID" >
</id>
<property name="name" />
<bag name="Students" table="ClassStudentRelation" cascade="all" inverse="false">
<key column="ClassID"></key>
<many-to-many class="Student" column="StudentID" />
</bag>
</class>
</hibernate-mapping>此外,您不能覆盖nhibernate实体中的集合。应该尽快初始化这些集合,然后就可以使用AddClass/AddStudent方法了。
class Student
{
...
public virtual IList<Class> Classes { get; set; } = new List<Class>();
...
}
Student sven2= new Student { StudentID = 62, name = "sven2" };
sven2.AddClass(Ai);
Ai.AddStudent(sven2);
mySession.Save(sven2);
mySession.Save(Ai);https://stackoverflow.com/questions/67943978
复制相似问题