
本文共 9602 字,大约阅读时间需要 32 分钟。
下周就去办理离职手续了,之前没有使用过NHibernate,只知道NHibernate是一种ORM框架,但是听说新公司是使用NHibernate在做项目,所以,我就网上找资料学习一下NHibernate,在此以笔记的形式,记录自己的学习过程,一来供自己以后备忘用,而来希望对同样准备学习NHibernate的同行门有所帮助或提供借鉴。
什么是Nhibernate?
NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型中去。
NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库。NHibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具。
NHibernate的目标主要是用于与数据持久化相关的编程任务,能够使开发人员从原来枯燥的SQL语句的编写中解放出来,解放出来的精力可以让开发人员投入到业务逻辑的实现上。
我最不喜欢理论知识了,还是那句话,实践出真知,我将以最直观的形式来表达。下面开始动手来构建我们的NHibernate应用程序。
开发环境:Win7、VS2012、Sqlserver2008
搭建项目
我这里使用asp.net mvc项目
然后再依次分别新建3个类库项目,Shop.Domain,Shop.Data,Shop.Business
最终效果图如下:
项目架构说明
采用传统三层架构
Shop.Domain:数据实体和数据库映射文件。也有人叫做领域层。
Shop.Data:数据层,存放数据库的操作及Nhibernate辅助类。引用Iesi.Collections.dll,NHibernate.dll和类库Shop.Domain
Shop.Business:业务逻辑类。引用类库项目Shop.Domain, Shop.Data
Shop.WebSite:测试项目。需引用Iesi.Collections.dll,NHibernate.dll和类库项目Shop.Domain, Shop.Business
下载Nhibernate
安装完成之后,自动添加了如下引用:
数据库设计
为了省事,数据库,我就直接使用northwnd.mdf了,下载地址:,数据库——附加
关于NorthWind表和字段的说明请查看:
Nhibernate数据库配置
打开本项目解决方案所在文件夹位置:E:\WorkSpace\Study\Webs\MVC\Shop,会发现有一个packages文件夹,打开此packages文件夹,
会看到一个NHibernate.4.0.3.4000文件夹,打开如下图:
这里使用的是SQL Server2008,所以我们使用MSSQL.cfg.xml文件,将此文件复制到Shop.WebSite应用程序根目录,然后重命名为hibernate.cfg.xml.,修改hibernate.cfg.xml
注意需根据自己数据库的实例名修改,并添加mapping节点,其他的设置,可根据需要进行添加。
修改后如下(我对配置文件都加上了注释):
NHibernate.Driver.SqlClientDriver Server=.;database=Northwind;uid=sa;pwd=yujie1127 NHibernate.Dialect.MsSql2008Dialect
最后,记得修改hibernate.cfg.xml文件的属性,
NHibernateHelper辅助类
这里编写一个简单的辅助类NHibernateHelper,用于创建ISessionFactory和配置ISessionFactory,并打开一个新的ISession的方法。在Shop.Data项目下新建一个类NHibernateHelper,代码如下:
using NHibernate;using NHibernate.Cfg;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace Shop.Data{ public class NHibernateHelper { private ISessionFactory _sessionFactory; public NHibernateHelper() { //创建ISessionFactory _sessionFactory = GetSessionFactory(); } ////// 创建ISessionFactory /// ///public ISessionFactory GetSessionFactory() { //配置ISessionFactory return (new Configuration()).Configure().BuildSessionFactory(); } /// /// 打开ISession /// ///public ISession GetSession() { return _sessionFactory.OpenSession(); } }}
持久化类
为客户实体创建持久化类Customers。在项目Shop.Domain中新建文件夹Entities,然后新建类Customers,这里为了偷懒,我就使用动软工具生成代码如下:
注意:NHibernate默认使用代理功能,要求持久化类不是sealed的,而且其公共方法、属性和事件声明为virtual。在这里,类中的字段要设置为virtual,否则出现“NHibernate.InvalidProxyTypeException”类型的异常在 Shop.Data.dll 中发生,但未在用户代码中进行处理
public class Customers { #region Model private string _customerid; private string _companyname; private string _contactname; private string _contacttitle; private string _address; private string _city; private string _region; private string _postalcode; private string _country; private string _phone; private string _fax; ////// 客户ID 主键 /// public virtual string CustomerID { set { _customerid = value; } get { return _customerid; } } ////// 公司 /// public virtual string CompanyName { set { _companyname = value; } get { return _companyname; } } ////// 客户姓名 /// public virtual string ContactName { set { _contactname = value; } get { return _contactname; } } ////// 客户头衔 /// public virtual string ContactTitle { set { _contacttitle = value; } get { return _contacttitle; } } ////// 联系地址 /// public virtual string Address { set { _address = value; } get { return _address; } } ////// 所在城市 /// public virtual string City { set { _city = value; } get { return _city; } } ////// 所在地区 /// public virtual string Region { set { _region = value; } get { return _region; } } ////// 邮编 /// public virtual string PostalCode { set { _postalcode = value; } get { return _postalcode; } } ////// 国籍 /// public virtual string Country { set { _country = value; } get { return _country; } } ////// 电话 /// public virtual string Phone { set { _phone = value; } get { return _phone; } } ////// 传真 /// public virtual string Fax { set { _fax = value; } get { return _fax; } } #endregion Model}
编写映射文件
编写NHibernate配置文件智能提示的功能。只要在下载的NHibernate里找到configuration.xsd和nhibernate-mapping.xsd两个文件并复制到vs安装目录下,如D:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas目录即可。
此时,你在nhibernate的配置文件中就有智能提示功能了。
nhibernate如何知道持久化类和数据库表的对应关系的呢?这就要通过映射文件来完 成这个任务了,映射文件包含了对象/关系映射所需的元数据。元数据包含持久化类的声明和属性到数据库的映射。映射文件告诉nhibernate它应该访问 数据库里面的哪个表及使用表里面的哪些字段。
那么我们编写Customers持久化类的映射文件,注意映射文件以.hbm.xml结尾。如Customers.hbm.xml
我同样使用动软代码生成工具生成映射文件,代码如下:
最后记得给此映射文件设置属性
添加数据访问层类CustomersData.cs:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using NHibernate;using NHibernate.Linq;using NHibernate.Cfg;using System.Linq.Expressions;using Shop.Domain.Entities;namespace Shop.Data{ public class CustomersData { ////// 根据条件得到客户信息集合 /// /// 条件 ///客户信息集合 public IListGetCustomerList(Expression > where) { try { NHibernateHelper nhibernateHelper = new NHibernateHelper(); ISession session = nhibernateHelper.GetSession(); return session.Query ().Select(x=>new Customers { ContactName=x.ContactName,City=x.City,Address=x.Address,Phone=x.Phone,CompanyName=x.CompanyName,Country=x.Country}).Where(where).ToList(); } catch (Exception ex) { throw ex; } } } }
添加业务逻辑层类CustomersBusiness.cs:
using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;using System.Text;using System.Threading.Tasks;using Shop.Data;using Shop.Domain.Entities;namespace Shop.Business{ public class CustomersBusiness { private CustomersData _customersData; public CustomersBusiness() { _customersData = new CustomersData(); } ////// 根据条件得到客户信息集合 /// /// 条件 ///客户信息集合 public IListGetCustomerList(Expression > where) { return _customersData.GetCustomerList(where); } } }
添加控制器:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using Shop.Business;using Shop.Domain.Entities;namespace Shop.Controllers{ public class CustomersController : Controller { CustomersBusiness customersBusiness = new CustomersBusiness(); // // GET: /Customer/ public ActionResult Index() { var result = customersBusiness.GetCustomerList(c => 1 == 1); return View(result); } } }
添加视图Index:
@model IEnumerable@{ ViewBag.Title = "Index";} Index
@Html.ActionLink("Create New", "Create")
@foreach (var item in Model) { @Html.DisplayNameFor(model => model.CompanyName) @Html.DisplayNameFor(model => model.ContactName) @Html.DisplayNameFor(model => model.Address) @Html.DisplayNameFor(model => model.City) @Html.DisplayNameFor(model => model.Country) @Html.DisplayNameFor(model => model.Phone) } @Html.DisplayFor(modelItem => item.CompanyName) @Html.DisplayFor(modelItem => item.ContactName) @Html.DisplayFor(modelItem => item.Address) @Html.DisplayFor(modelItem => item.City) @Html.DisplayFor(modelItem => item.Country) @Html.DisplayFor(modelItem => item.Phone) @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) | @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) | @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
运行程序,效果图:
感冒一周了还没好,人好难受,可怜我还在电脑旁边工作着,今天就暂时先写到这里了,写博客确实是很耗时的工作。
发表评论
最新留言
关于作者
