1:创建三张表T_Course、T_Student、T_Middle;其中一个学生可以对应多个课程,一个课程也可以对应多个学生,用T_Middle存放它们的关系内容;

CREATE TABLE [dbo].[T_Course](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CourseName] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_T_Course] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] CREATE TABLE [dbo].[T_Student](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[StudentNum] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_T_Student] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] CREATE TABLE [dbo].[T_Middle](
[ID] [int] IDENTITY(1,1) NOT NULL,
[StudentID] [int] NULL,
[CourseID] [int] NULL,
CONSTRAINT [PK_T_Middle] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

2:实体的代码,其中两个类中都有IList,中间关系类就不用创建的:

    public class CourseModel
{
public virtual int Id { get; set; }
public virtual string Coursename { get; set; }
public virtual IList Students { get; set; }
} public class StudentModel
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual string Studentnum { get; set; }
public virtual IList Courses { get; set; }
}

3:XML映射文件的内容

3.1 CourseModel.hbm.xml文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="Wujy.ModelLibrary" namespace="Wujy.ModelLibrary.Entity" xmlns="urn:nhibernate-mapping-2.2">
<class name="CourseModel" table="T_Course" lazy="true" >
<id name="Id" column="ID">
<generator class="identity" />
</id>
<property name="Coursename">
<column name="CourseName" sql-type="varchar" not-null="false" />
</property>
<bag name="Students" table="T_Middle" lazy="true" inverse="true">
<key column="CourseID"></key>
<many-to-many column="StudentID" class="StudentModel"></many-to-many>
</bag>
</class>
</hibernate-mapping>

3.2 StudentModel.hbm.xml文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="Wujy.ModelLibrary" namespace="Wujy.ModelLibrary.Entity" xmlns="urn:nhibernate-mapping-2.2">
<class name="StudentModel" table="T_Student" lazy="true" >
<id name="Id" column="ID">
<generator class="identity" />
</id>
<property name="Name">
<column name="Name" sql-type="varchar" not-null="false" />
</property>
<property name="Studentnum">
<column name="StudentNum" sql-type="varchar" not-null="false" />
</property>
<bag name="Courses" table="T_Middle" lazy="true" inverse="false">
<key column="StudentID"></key>
<many-to-many column="CourseID" class="CourseModel"></many-to-many>
</bag>
</class>
</hibernate-mapping>

注意:inverse:意思是反转,它指明类之间的关系由谁来进行维护。例如:班级(Class类)与学生(Student),班级-学生就是one-to-many,学生-班级就是many-to-one。它只能在 one-to-many中many的一方进行设置(当然,在many一方,可能是在<set>也可能是在<bag>也可能是在<array>中进行设置),而对于one方,是不进行Inverse设置的。在NHibernate 社区,inverse默认值为false。

4: 主要代码如下

        protected void Button1_Click(object sender, EventArgs e)
{
CourseModel coursemodel = new CourseModel();
StudentModel studentModel = new StudentModel();
coursemodel.Coursename = "软件工程";
int CID = CourseBll.NewAdd(coursemodel); studentModel.Name = "踏浪帅";
studentModel.Studentnum = "20098991";
studentModel.Courses = new List<CourseModel>();
studentModel.Courses.Add(coursemodel);
StudentBll.NewAdd(studentModel); } protected void Button2_Click(object sender, EventArgs e)
{
CourseModel coursemodel = new CourseModel();
coursemodel.Coursename = "软件工程";
CourseBll.Add(coursemodel);
} protected void Button3_Click(object sender, EventArgs e)
{
StudentModel model = StudentBll.findById(1);
StudentBll.Remove(model);
}

感谢您的阅读,坚持每天进步一点点,离成功就更新一步;希望文章对您有所帮助;源代码下载

转载至:http://www.cnblogs.com/wujy/p/3602300.html

NHibernate初学六之关联多对多关系的更多相关文章

  1. NHibernate初学五之关联一对多关系

    1:创建两张表T_Country.T_Person:其中T_Person表中有一个CountryID对应T_Country的ID,一个Country可以对应多个Person CREATE TABLE ...

  2. 用NHibernate处理带属性的多对多关系

    1.引言 老谭在面试开发者的时候,为了考察他们的数据库开发能力,经常祭出我的法宝,就是大学数据库教程中讲到的一个模式:学生选课.这个模式是这种: 在这个模式中,学生(Student)和课程(Cours ...

  3. NHibernate初学四之关联一对一关系

    1:数据库脚本,创建两张表T_Area.T_Unit,表示一个单位对应一个地区,在单位表中有个AreaID为T_Area表中的ID: CREATE TABLE [dbo].[T_Area]( [ID] ...

  4. Hibernate框架学习(六)——一对多&多对一关系

    一.关系表达 1.表中的表达 2.实体中的表达 3.orm元数据中的表达 一对多:(在Customer.hbm.xml中添加) 多对一:(在LinkMan.hbm.xml中添加) 最后别忘了在hibe ...

  5. [NHibernate]多对多关系(关联查询)

    目录 写在前面 文档与系列文章 多对多关系关联查询 总结 写在前面 上篇文章介绍了nhibernate中对一对多关系进行关联查询的几种方式,以及在使用过程需要注意的问题.这篇文章对多对多关系的查询处理 ...

  6. [转]NHibernate之旅(11):探索多对多关系及其关联查询

    本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...

  7. NHibernate系列文章十九:NHibernate关系之多对多关系(附程序下载)

    摘要 NHibernate的多对多关系映射由many-to-many定义. 从这里下载本文的代码NHibernate Demo 1.修改数据库 添加Product表 添加ProductOrder表 数 ...

  8. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)

    在这章中,我们将学习如何创建一个管理图片的新实体,如何使用HTML表单上传图片文件,并使用多对多关系将它们和产品关联起来,如何将图片存储在文件系统中.在这章中,我们还会学习更加复杂的异常处理,如何向模 ...

  9. Hibernate 、多表关联映射 - 多对多关系映射(many-to-many)

    hibernate.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...

随机推荐

  1. angular学习笔记(八)-控制视图显示隐藏

    本篇介绍angular控制视图的显示和隐藏: 通过给元素添加ng-show属性或者ng-hide属性来控制视图的显示或隐藏: ng-show: 绑定的数据值为true时,显示元素,值为false时,隐 ...

  2. 带limit的hivesql排序

    带limit的hivesql排序   select requestdomain,count(1) as cnt from ods_cndns_real_log where dt = 20160707 ...

  3. Hadoop副本数配置

    一个文件,上传到hdfs上时指定的是几个副本就是几个.修改了副本数(dfs.replications),对已经上传了的文件也不会起作用.当然可以在上传文件的同时指定创建的副本数hadoop dfs - ...

  4. js获取下拉,单选

    1.JS取下拉框的显示值和判断单选按钮 1.需要得到select组件显示的值.下面是经常用到的方法: Html 源码: <html><body><select id=&q ...

  5. C#基础-获得当前程序的 空间名.类名.方法名

    string typeName = this.GetType().ToString();//空间名.类名 string typeName = this.GetType().Name;//类名 new ...

  6. OpenFileDialog 打开文件

    OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "选择导入的文件"; ofd.FilterIndex = 1; ofd ...

  7. 抽取、转换和装载介绍(三)ETL系统的34个子系统

    这部分对ETL系统的架构中34个关键子系统进行分类.ETL其实可以分为下面四个步骤: 抽取.在ETL环境中从源系统收集原始数据并且在对任何对数据的重要重构发生之前都将数据写入磁盘.子系统1到子系统3都 ...

  8. Apache HttpComponents 如何在正常结束前中止一个HTTP请求

    package org.apache.http.examples.client; import org.apache.http.HttpEntity; import org.apache.http.H ...

  9. js学习笔记32----new

    new:用于创建一个对象. 有 new 与 无 new 时的区别,查看下面的示例代码应该会增加感觉: <!DOCTYPE html> <html lang="en" ...

  10. [mysql] 关联查询sql记录

    //查询账单关联订单 select o.id as id, o.order_no as orderNo, o.case_no as caseNo, o.send_time as sendTime, o ...