【问题标题】:Nhibernate many to many xml休眠多对多xml
【发布时间】:2021-08-28 19:24:56
【问题描述】:

我想在 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>

我主要创建了这些对象

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 表中提交信息,但我想提交 ai2 和 sven2 以及另一个列表,我将信息放入 3 个表中但是这确实有效,有人知道如何解决它。 错误与

不匹配
NHibernate.Collection.Generic.PersistentGenericBag and NHibernate.Collection.Generic.PersistentGenericList

【问题讨论】:

    标签: c# sql orm nhibernate


    【解决方案1】:

    Classes 包映射存在问题。假设 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>
    

    您也不能覆盖您的休眠实体中的集合。集合应尽快初始化,然后您可以使用 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2015-12-22
      • 2011-04-12
      • 2011-02-13
      相关资源
      最近更新 更多