NHibernate简介:
NHibernate是一个面向.net环境的对象/关系数据库映射工具,对象/关系数据库映射(object/relational mapping,ORM)是一种技术,可以将对象模型表示的对象映射到基于SQL的关系型数据结构中去。NHibernate是一个基于.net的针对关系型数据的持久化类库。NHibernate是主要用于数据持久化编程。
1.新建MVC项目
2.项目架构:
采用传统三层架构:
- Domain:领域层,存放实体和映射文件
- Data:数据层,存放数据库的操作已经NHibernate辅助类,引用Iesi.Collections.dll,NHibernate.dll和类库领域层类
- Business:业务逻辑层,用来处理实体和数据。得引用领域层类(实体)和数据层类(数据操作)。
- website:实际应用的地方,要引用领域层(实体)和业务逻辑层(对实体进行业务逻辑的操作)
3.在数据层安装NHibernate,可以使用VS自带nuget来安装 Install-Package Nhibernate ,安装完后就会有相应的引用
4.在项目文件的目录的packages下能找到NHibernate的数据库配置模版。找到后添加到我们要实际操作的项目的根目录去,进行相应的配置。注意将cfg.xml文件的属性改成始终复制。
NHibernate.Driver.SqlClientDriver Server=.;database=Northwind;uid=sa;pwd=yujie1127 NHibernate.Dialect.MsSql2008Dialect
5.编写辅助类
在数据层编写辅助类,用于创建用于创建ISessionFactory和配置ISessionFactory,并打开一个新的ISession的方法。在Data项目下新建一个类NHibernateHelper:
第一步:先申明一个IsessionFactory,第二步:创建IsessionFactory,第三步:配置IsessionFactory,第四步:开始Isession。
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 { //先申明一个ISessionDFactory()会话工厂 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(); } }}
6.持久化类:
为客户实体创建持久化类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}
7.编写映射文件
编写NHibernate配置文件智能提示的功能。只要在下载的NHibernate里找到configuration.xsd和nhibernate-mapping.xsd两个文件并复制到vs安装目录下,如D:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas目录即可。其他的类库类似操作
nhibernate如何知道持久化类和数据库表的对应关系的呢?这就要通过映射文件来完 成这个任务了,映射文件包含了对象/关系映射所需的元数据。元数据包含持久化类的声明和属性到数据库的映射。映射文件告诉nhibernate它应该访问 数据库里面的哪个表及使用表里面的哪些字段。
那么我们编写Customers持久化类的映射文件,注意映射文件以.hbm.xml结尾。如Customers.hbm.xml
我同样使用动软代码生成工具生成映射文件,代码如下:
最后记得给此映射文件设置属性:嵌入的资源
8.添加数据访问层类
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 */ })
原文链接: