我的NHibernate之路(2)---主从表(一对多)配置篇
通过我上篇文章的配置,单独做一张表的操作已经够了。但是在我们实际开发的过程中,很多时候数据库中都存在着主从表等关系,这时候就存在主表中的一条记录可能对应多条从表中的记录。那么这种情况下,我们还用上篇文章的的简单配置就不够了。下面我通过一个实际的例子说说Nhibernate中主从表的配置。
先介绍开发环境和软件版本:VS2008 SP1、NHibernate-2.1.2.GA-bin。在下面的例子中,就两张表,一张Class表,一张Student表。这就是一个典型的主从表的关系。
这种情况下的Nhibernate配置与上篇中的相同,所需要改变的是映射文件的配置。操作如下:
1、映射文件配置。
主表的映射:一对多的关系。配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="NHibernateSample.Model">
<class name="NHibernateSample.Model.Class, Model" table="`Class`">
<id name="Id" type="Int32" unsaved-value="0">
<column name="ClassId" length="4" sql-type="int" not-null="true" unique="true" index="PK_Class"/>
<generator class="native" />
</id>
<property name="ClassCode" type="String">
<column name="ClassCode" length="50" sql-type="varchar" not-null="false"/>
</property>
<property name="PeopleCount" type="Int32">
<column name="PeopleCount" length="4" sql-type="int" not-null="false"/>
</property>
<bag name="Students" inverse="true" lazy="true" cascade="all-delete-orphan">
<key column="ClassId"/>
<one-to-many class="NHibernateSample.Model.Student, Model"/>
</bag>
</class>
</hibernate-mapping>
其中,黑色部分便是对一对多关系的配置。说明如下:
bag:对象结合。结合中的元素可以重复。相当于.Net中的IList或者IList<T>.name="Students"说的是在实体类Class中有一个Students的属性。inverse=“TRUE”说名是子实体类维护关联关系,它默认为FALSE,即夫实维护关联关系。cascade="all-delete-orphan"指明当添加主表中的记录时,会添加相关的记录到字表中,此时相当于“save-update”。当删除主表中的记录时,会级联删除字表中相关联的记录,此时相当于“delete”在父类中删除对应数据库记录时。即在子表中不会出现一些与主表无关联的数据。
key:column="ClassId"说明是"ClassId"列与字表关联
one-to-many class="NHibernateSample.Model.Student, Model"。one-to-many指明是一对多的关系。在此映射文件中一当然是指Class实体。多指的是Model程序集中的、命名空间为NHibernateSample.Model的Student实体
从表的映射:多对已的关系。配置如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="NHibernateSample.Model">
<class name="NHibernateSample.Model.Student, Model" table="Student">
<id name="Id" type="Int32" unsaved-value="0">
<column name="StudentID" length="4" sql-type="int" not-null="true" unique="true" index="PK_Student"/>
<generator class="native" />
</id>
<property name="Name" type="String">
<column name="Name" length="50" sql-type="varchar" not-null="false"/>
</property>
<property name="Tel" type="String">
<column name="Tel" length="50" sql-type="varchar" not-null="false"/>
</property>
<many-to-one name="Class" class="NHibernateSample.Model.Class, Model">
<column name="ClassId" length="4" sql-type="int" not-null="false"/>
</many-to-one>
</class>
</hibernate-mapping>
这里我也只说说many-to-one含义.
many-to-one:指的是多个Student对应一个Class, name="Class"指Student实体中有一个Class的属性。Class位于程序集Model中,它对应的是NHibernateSample.Model.Class类。
column namee="ClassId"指的是ClassId和Class表关联
2、对涉及的主从表的添加操作。
Class c = new Class(); //班级类 Student stu = new Student(); //学生类 stu.Name = "tao"; stu.Tel = "123123123"; stu.Class = c; c.PeopleCount = 30; c.ClassCode = "03510236"; c.Students.Add(stu); //将学生添加到班级中 ClassBLL cBLL = new ClassBLL(); cBLL.AddClass(c); //将班级、学生持久化到数据库
总结:多对一得映射和没有主从表关联关系的表不同的地方就是需要在主、从表中分别指明映射关系,即应分别在主表对应的实体类的映射文件与从表对应的实体文件中表现出来。添加的时候只需要将从表对应的实体添加到主表对应的实体中,然后添加主表对应的实体即完成了对主从表的操作。
谢谢您的阅读,希望此文对你有一定的帮助!