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. Windows mobile 下读取手机SIM卡信息(转)

    Windows mobile 下读取手机SIM卡信息 c#改善 Windows mobile 下读取手机SIM卡信息

  2. posix多线程--线程取消

    1.三种取消状态Off                   禁用取消Deferred           推迟取消:在下一个取消点执行取消Asynchronous   异步取消:可以随时执行取消 in ...

  3. JAVA-JSP动作元素之param

    相关资料:<21天学通Java Web开发> 结果总结:1.用来传递参数,一般与<jsp:include>.<jsp:forward>联合使用.2.<jsp: ...

  4. How to Use HTML5 FUll Screen API(如何使用HTML5全屏接口) 【精】

    原文链接:http://www.sitepoint.com/use-html5-full-screen-api/ 如果你不太喜欢变化太快的东西,那么web开发可能不适合你.我曾在2012年末有写过Fu ...

  5. 浅谈C#委托和事件【转】

    委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本 ...

  6. 使用Windows防火墙禁止Ping入

    前言: 不知道安全比赛是咋样的,但是肯定是日来日去的,那么故事来了,大牛们肯定会狂ip,刚开始肯定是一个段的狂扫.咋让他不扫到你呢?就是这篇文章了.其实这一切都是ICMP在作祟 windows2003 ...

  7. hdu4366 Successor

    好题.   可是感觉题目描写叙述不是非常清楚 这题仅仅是询问开除某人后,他的下属中谁会替代他的位置.不会更新这个位置 要求一个子树中忠诚度最高的人. 能够想到dfs树.保留时间戳.每一个节点便表示一个 ...

  8. 【Unity笔记】获得鼠标点击屏幕的位置,并转成世界坐标

    Vector3 pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

  9. 【C#】遍历List列表的同时,移除访问到的元素

    需求:遍历List列表,当访问的元素符合某一条件时,将该元素移除出列表. 注意点:使用foreach循环遍历无法做到边读边修改,所以要使用for循环. 例子: // 倒序遍历. for (int i ...

  10. Nginx实战系列之功能篇----后端节点健康检查(转)

    公司前一段对业务线上的nginx做了整理,重点就是对nginx上负载均衡器的后端节点做健康检查.目前,nginx对后端节点健康检查的方式主要有3种,这里列出:   1.ngx_http_proxy_m ...