上次用EF演示了数据库多对多关系的操作,这次我们还是引用上次的案例,来演示如何在C#当中使用NHibernate。

首先介绍一下NHibernate框架的来源。熟悉Java编程的读者肯定知道Hibernate这个ORM。NHibernate就来源于Java中著名的ORM框架—Hibernate,这点从名称当中就能够知道。目前NHibernate的最新版本是3.3.3,好像有一阵子没有update了,说明当前的版本也比较稳定了。具体的资料可以到官网查询:http://nhforge.org/。

1、下载NHibernate

官网首页就有下载链接,直接下载就可以了。

下载好之后会得到一个zip包。

我们就地解压可以看到如下目录和文件:

我们重点关注以下目录的内容:

Configuration_Templates目录:默认提供的一些配置模板。有支持Oracle、Sql Server、MySQL等等。

Required_Bins目录:这里面存放了我们开发时常用的dll文件。其中的两个xsd文件是能够提供智能提示的文件,我们需要将它们俩复制到你本地的VS的Schemas目录下,比如我的目录为:D:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas 。

复制好之后,重启VS,在我们写Hibernate配置文件时就有了智能提示了。

准备工作做好之后,我们就可以正式演示。

2、创建一个类库项目Model

我们定义好两个类,分别为Student和Subject,为了便于管理,我们将它们放到Entity文件夹里,但命名空间仍为Model。

namespace Model
{public enum Gender { Female, Male }public class Student{public virtual int? StudentId { get; set; }public virtual string StudentName { get; set; }public virtual Gender Gender { get; set; }public virtual DateTime? BirthDay { get; set; }public virtual IList<Subject> Subjects { get; set; }}
}
namespace Model
{public class Subject{public virtual int? SubjectId { get; set; }public virtual string SubjectName { get; set; }public virtual IList<Student> Students { get; set; }}
}

这是一个典型的多对多的应用场景。一个学生可以选修多个课程,一个课程可以被多个学生选修。

接下来我们再创建相应的Hibernate配置文件(就是普通的xml文件,取名为Student.hbm.xml和Subject.hbm.xml)。

Student.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="Model"><class name="Student" table="T_Student" lazy="true"><id name="StudentId"  type="int" column="StudentId"><generator class="native"/></id><property name="StudentName" type="string" column="StudentName"><column name="StudentName" length="50"/></property><property name="Gender" type="Gender" column="Gender"><column name="Gender" length="4"/></property><property name="BirthDay" type="datetime" column="BirthDay"><column name="BirthDay" length="20"/></property><bag name="Subjects" table="T_Student_Subject"><key column="StudentId"/><many-to-many class="Subject" column="SubjectId"/></bag></class>
</hibernate-mapping>

Subject.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="Model"><class name="Subject" table="T_Subject" lazy="true"><id name="SubjectId" type="int" column="SubjectId"><generator class="native"/></id><property name="SubjectName" type="string"><column name="SubjectName" length="50"/></property><bag name="Students" table="T_Student_Subject"><key column="SubjectId"/><many-to-many class="Student" column="StudentId"/></bag></class>
</hibernate-mapping>

便于管理我们同样的放到Config目录下(自己创建的文件夹)。

同时修改两个xml文件的生成操作由内容变为嵌入的资源(在vs中右键xml文件选择属性)


3、创建一个控制台应用程序

表和实体对应的内容已经定义好,下面关键的就是要写代码来测试NHibernate了,本着尽量降低学习难度的原则,我这里就用控制台应用程序来验证(你也可以新建一个类库项目,然后用VS的单元测试或者第三方测试工具NUnit进行验证)。

首先将下载的开发包里面的Configuration_Templates文件夹下的MSSQL.cfg.xml复制到控制台应用程序中(为方便管理,我新建了一个Config文件夹,并把这个xml文件放到这里面,重命名为hibernate.cfg.xml)。

修改这个xml文件内容为:

<?xml version="1.0" encoding="utf-8"?>
<!--
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
for your own use before compile tests in VisualStudio.
-->
<!-- This is the System.Data.dll provider for SQL Server -->
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" ><session-factory name="NHibernate.Test"><property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property><property name="connection.connection_string">Server=.;database=nhibernateTest;uid=sa;pwd=123456;</property><property name="adonet.batch_size">10</property><property name="show_sql">true</property><property name="hbm2ddl.auto">update</property><property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property><mapping assembly="Model"/></session-factory>
</hibernate-configuration>

注意这里面的一些节点的配置。比如mapping assembly里面的Model,就是指的是程序集的名称。同时将此文件的复制到输出目录方式修改为始终复制。

接下来,给控制台项目添加两个dll的引用,分别为Iesi.Collections.dll和NHibernate.dll,也是在Required_Bins文件夹里面。

添加好引用,我们创建一个新的类NHibernateTest来写关键性代码。

namespace NHibernateDemo
{public class NHibernateTest{private ISessionFactory _sessionFactory;public ISessionFactory SessionFactory{get{if (_sessionFactory == null){var cfg = new NHibernate.Cfg.Configuration().Configure("Config/hibernate.cfg.xml");_sessionFactory = cfg.BuildSessionFactory();}return _sessionFactory;}}public void TestInit(){using (ISession session = SessionFactory.OpenSession()){IList<Subject> subjects = new List<Subject>(){new Subject { SubjectName = "数学" },new Subject { SubjectName = "英语" },new Subject { SubjectName = "计算机" },};IList<Student> students = new List<Student>(){new Student{StudentName = "guwei4037",Gender = Gender.Male,BirthDay = new DateTime(1984, 11, 25),Subjects = subjects.Where(x => x.SubjectName == "数学" || x.SubjectName == "计算机").ToArray(),},new Student{StudentName = "gary.gu",Gender = Gender.Female,BirthDay = new DateTime(1987, 9, 15),Subjects = subjects.Where(x => x.SubjectName == "数学" || x.SubjectName == "英语").ToArray(),},};ITransaction tran = session.BeginTransaction();try{foreach (var subject in subjects){session.Save(subject);}foreach (var student in students){session.Save(student);}tran.Commit();}catch (Exception ex){tran.Rollback();throw ex;}}}}
}

这是一个带事务的多表插入的操作。

最后在Main方法中,写入简单的调用方法。

public class program{public static void Main(string[] args){NHibernateTest test = new NHibernateTest();test.TestInit();}}

在运行这个程序之前,还要做一件事,就是要在你的Sql Server中新建一个空的数据库nhibernateTest,否则会提示登录失败。

好了,这时我们已经准备好了一切,让我们运行一下这个控制台应用程序吧。

由于我们在hibernate.cfg.xml文件中定义了输入sql,所以会看到窗口中的内容。

好,没有报错。我们打开Sql Server看一下最终的结果。

而且数据库的表、主外键的关联以及数据都为我们自动生成了。

好,双向多对多的关系就演示到这里。如果需要更多详细的信息请参考:http://nhforge.org/doc/nh/en/index.html。

转载于:https://blog.51cto.com/csharper/1359457

NHibernate多对多关联映射的实现相关推荐

  1. NHibernate从入门到精通系列(7)——多对一关联映射

    内容摘要 多对一关联映射概括 多对一关联映射插入和查询 多对一关联映配置介绍 一.多对一关联映射概括 关联关系是实体类与实体类之间的结构关系,分别为"多对一"."一对一& ...

  2. hibernate之多对多关联映射

    hibernate之多对多关联映射 转载于:https://www.cnblogs.com/liuyang-1037/archive/2009/06/06/1497589.html

  3. 步步为营Hibernate全攻略(三)剪不断理还乱之:多对多关联映射

    hibernate多对多关联映射同样可以分为单向的关联映射和双向的关联映射,与一对多关联映射相比,双方之间的关系将不再由其中多的一方维护而是变成了由第三张表来维护.第三张表的出现不仅减少了两张表中的数 ...

  4. mybatis手写多对多关联映射

    mybatis手写多对多关联映射 1.一对一关联查询 1.1resultType实现 1.2resultMap实现 2.一对多关联查询 3.多对多关联查询 4.resultType与resultMap ...

  5. 多对多关联映射(双向)

    关联映射方面的最后一篇了,我觉得映射文件的编写是使用hibernate的基础,而关联映射又是基础的基础,所以这方面分的细一些,罗嗦一些,说明白就好,呵呵. 多对多关联(双向),相对单向,在实体上就是一 ...

  6. JAVA两个表相关联_关于Java:如何将多对多关联映射到映射到两个不同表的类?...

    我有一个凭证-POJO映射到两个表. 第一个映射分配一个实体名称" voucherA",并将POJO映射到TableA. 第二个映射使用" voucherB"作 ...

  7. 【Hibernate框架】关联映射(多对多关联映射)

    按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...

  8. hibernate_day03_多对多关联映射

    hibernate_day03_MySQL数据库-表与表之间的多对多关系-实例 hibernate_day03_一对多相关操作 Hibernate多对多关系的配置 : (1)创建表 : 用户表 [cr ...

  9. MyBatis 多对多关联映射

    示例[通过班级查询老师信息] 创建t_classes 创建t_classessTeacher 创建t_teacher 创建Classes package com.po; import java.uti ...

最新文章

  1. 每天一个linux命令(7):mv命令
  2. 消息中间件:为什么我们选择 RocketMQ
  3. 计算机组成要素二:布尔运算:ALU算术运算器
  4. 程序高手和菜鸟的区别是什么?
  5. 转: 记录centos7 安装erlang22.3和rabbitMQ
  6. 计算机主机图片开机按钮,解决电脑开机按钮无法使用方法
  7. jquery-ajax请求-1909
  8. mongodb php update,MongoDB文档的更新(php代码实例)
  9. python方法解析顺序_浅谈Python的方法解析顺序(MRO)
  10. java标识符定义_Java标识符命名规范
  11. 【系统架构】业务架构图
  12. Delphi微信公众号开发
  13. uniapp拍照上传照片流程笔记
  14. PWM控制电机转速、PWM原理
  15. 解决外边距坍塌的几种方法
  16. 现代经商赚钱必备36计(1)
  17. 谈谈win10的简单美化
  18. 终于修改了EXE的图标罗
  19. 高效的磁力搜索引擎 -_高效的企业测试-结论(6/6)
  20. C++中的FILL和MEMSET(zzl)

热门文章

  1. Vscode 过滤.pyc文件
  2. glibc和ulibc的区别
  3. ip地址子网划分工具_大型视频监控网络系统如何规划ip地址?
  4. 零基础入门学习Python,我与python的第一次亲密接触后的感受!
  5. 导致网速变慢的安全隐患
  6. 基于Redis实现一个分布式锁
  7. 【初识Java】 -- Java的数据类型与运算符
  8. CSS图像中的一些属性
  9. EOJ Monthly 2020.7 Sponsored by TuSimple 部分题解
  10. easyuefi只能在基于uefi启动的_苹果电脑怎么从u盘启动|苹果笔记本按哪个键选u盘启动...