首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nhibernate多对多xml

Nhibernate多对多xml
EN

Stack Overflow用户
提问于 2021-06-12 06:11:54
回答 1查看 37关注 0票数 0

我想在Nhibernate中建立一个多对多的关系,但我现在卡住了,我有3个sql表,学生类和学生类关系,我已经用c#写了2个类。

代码语言:javascript
复制
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文件是这样的,另一个是一样的。

代码语言:javascript
复制
<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中,我创建了这个对象

代码语言:javascript
复制
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个表,但这工作有人知道如何修复它。错误是与不匹配

代码语言:javascript
复制
NHibernate.Collection.Generic.PersistentGenericBag and NHibernate.Collection.Generic.PersistentGenericList
EN

回答 1

Stack Overflow用户

发布于 2021-07-22 21:46:05

类包映射存在问题。假设ClassStudentRelation连接表具有StudentID和ClassID外键。映射应为:

代码语言:javascript
复制
<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对象的映射如下所示:

代码语言:javascript
复制
<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方法了。

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67943978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档