NHibernate初学六之关联多对多关系
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初学六之关联多对多关系的更多相关文章
- NHibernate初学五之关联一对多关系
1:创建两张表T_Country.T_Person:其中T_Person表中有一个CountryID对应T_Country的ID,一个Country可以对应多个Person CREATE TABLE ...
- 用NHibernate处理带属性的多对多关系
1.引言 老谭在面试开发者的时候,为了考察他们的数据库开发能力,经常祭出我的法宝,就是大学数据库教程中讲到的一个模式:学生选课.这个模式是这种: 在这个模式中,学生(Student)和课程(Cours ...
- NHibernate初学四之关联一对一关系
1:数据库脚本,创建两张表T_Area.T_Unit,表示一个单位对应一个地区,在单位表中有个AreaID为T_Area表中的ID: CREATE TABLE [dbo].[T_Area]( [ID] ...
- Hibernate框架学习(六)——一对多&多对一关系
一.关系表达 1.表中的表达 2.实体中的表达 3.orm元数据中的表达 一对多:(在Customer.hbm.xml中添加) 多对一:(在LinkMan.hbm.xml中添加) 最后别忘了在hibe ...
- [NHibernate]多对多关系(关联查询)
目录 写在前面 文档与系列文章 多对多关系关联查询 总结 写在前面 上篇文章介绍了nhibernate中对一对多关系进行关联查询的几种方式,以及在使用过程需要注意的问题.这篇文章对多对多关系的查询处理 ...
- [转]NHibernate之旅(11):探索多对多关系及其关联查询
本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...
- NHibernate系列文章十九:NHibernate关系之多对多关系(附程序下载)
摘要 NHibernate的多对多关系映射由many-to-many定义. 从这里下载本文的代码NHibernate Demo 1.修改数据库 添加Product表 添加ProductOrder表 数 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)
在这章中,我们将学习如何创建一个管理图片的新实体,如何使用HTML表单上传图片文件,并使用多对多关系将它们和产品关联起来,如何将图片存储在文件系统中.在这章中,我们还会学习更加复杂的异常处理,如何向模 ...
- Hibernate 、多表关联映射 - 多对多关系映射(many-to-many)
hibernate.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...
随机推荐
- 利用ItextSharp 生成PDF文档改进版
导入的ItextSharp.dll一定要是较高的版本 数据库表结构 生成的PDF样式 代码: namespace WebPDF { public partial class _Default : Sy ...
- Zookeeper运维的一些经验[转]
Zookeeper是一个分布式协调框架,有不错的性能,也经过许多公司的验证,所以在很多场景都有使用.大家一般用Zookeeper来实现服务发现(类似DNS),配置管理,分布式锁,leader选举等.在 ...
- 关于taglib的uri域
如果tld文件中有uri,那么你可以直接使用该tld文件中写的uri,就不用在web.xml中配置taglib了,如图 如果你在web.xml中配置了taglib,那么你也可以选择使用你配置的uri( ...
- jquery 拦截 post 等请求实现aop效果
$(function(){ jQuery.extend({ put: function( url, data, callback, type ) { // shift arguments if dat ...
- Python的内存管理 小理解
请看下面的一段代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 origin = {'a':100,'b':[1,2,34,5]} obj_copy ={}; ...
- JavaScript高级 面向对象(8)--浅拷贝代码实现
说明(2017.3.31): 1. 浅拷贝,只有值属性,没有引用属性. 2. 在原对象里面添加一个copy方法,返回本对象内的所有值属性. <!DOCTYPE html> <html ...
- 【C#/WPF】保存BitmapImage数据到文件中
参考: http://stackoverflow.com/questions/35804375/how-do-i-save-a-bitmapimage-from-memory-into-a-file- ...
- 设置cookies第二天0点过期
网上这个资料很少,试了csdn其中一个人的方法去算时间,返回的是Invalid Date,不知道是不是不同IE版本 返回结果不同 后面找到另外一个很简答粗暴的方法 直接加一天后,设置时分秒为0,代码如 ...
- catalina.home和catalina.base这两个属性的作用
catalina.home和catalina.base这两个属性仅在你需要安装多个Tomcat实例而不想安装多个软件备份的时候使用,这样能节省磁盘空间.以Tomcat6.0为例,其Tomcat目录结构 ...
- EasyUI项目中的自定义JS
自定义方法: (function($) { $.extend($, { //获取下标,删除时使用 getArrayIndex : function (array,value) { var index ...


