扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
上次用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 IListSubjects { get; set; } } }
namespace Model { public class Subject { public virtual int? SubjectId { get; set; } public virtual string SubjectName { get; set; } public virtual IListStudents { 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()) { IListsubjects = 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级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流