上次用EF演示了数据库多对多关系的操作,这次我们还是引用上次的案例,来演示如何在C#当中使用NHibernate。
创新互联建站长期为数千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为渭源企业提供专业的网站制作、网站设计,渭源网站改版等技术服务。拥有10多年丰富建站经验和众多成功案例,为您定制开发。首先介绍一下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 Subjects { get; set; }
}
} namespace Model
{
public class Subject
{
public virtual int? SubjectId { get; set; }
public virtual string SubjectName { get; set; }
public virtual IList Students { get; set; }
}
} 这是一个典型的多对多的应用场景。一个学生可以选修多个课程,一个课程可以被多个学生选修。
接下来我们再创建相应的Hibernate配置文件(就是普通的xml文件,取名为Student.hbm.xml和Subject.hbm.xml)。
Student.hbm.xml:
Subject.hbm.xml:
便于管理我们同样的放到Config目录下(自己创建的文件夹)。
同时修改两个xml文件的生成操作由内容变为嵌入的资源(在vs中右键xml文件选择属性)

3、创建一个控制台应用程序
表和实体对应的内容已经定义好,下面关键的就是要写代码来测试NHibernate了,本着尽量降低学习难度的原则,我这里就用控制台应用程序来验证(你也可以新建一个类库项目,然后用VS的单元测试或者第三方测试工具NUnit进行验证)。
首先将下载的开发包里面的Configuration_Templates文件夹下的MSSQL.cfg.xml复制到控制台应用程序中(为方便管理,我新建了一个Config文件夹,并把这个xml文件放到这里面,重命名为hibernate.cfg.xml)。
修改这个xml文件内容为:
NHibernate.Driver.SqlClientDriver Server=.;database=nhibernateTest;uid=sa;pwd=123456; 10 true update NHibernate.Dialect.MsSql2008Dialect
注意这里面的一些节点的配置。比如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 subjects = new List()
{
new Subject { SubjectName = "数学" },
new Subject { SubjectName = "英语" },
new Subject { SubjectName = "计算机" },
};
IList students = new List()
{
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。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。