4、ASP.NET MVC入门到精通——NHibernate构建一个ASP.NET MVC应用程序
发布日期:2021-05-09 03:56:34 浏览次数:11 分类:博客文章

本文共 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 IList
GetCustomerList(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 IList
GetCustomerList(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 */ })

运行程序,效果图:

感冒一周了还没好,人好难受,可怜我还在电脑旁边工作着,今天就暂时先写到这里了,写博客确实是很耗时的工作。

上一篇:C#开发可以可视化操作的windows服务
下一篇:Lucene.net站内搜索—6、站内搜索第二版

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月10日 07时20分26秒