博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在MVC中使用NHibernate学习记录
阅读量:5225 次
发布时间:2019-06-14

本文共 8911 字,大约阅读时间需要 29 分钟。

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 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 */ })

原文链接:

转载于:https://www.cnblogs.com/jackcheblog/p/6839934.html

你可能感兴趣的文章
算法之搜索篇
查看>>
新的开始
查看>>
java Facade模式
查看>>
NYOJ 120校园网络(有向图的强连通分量)(Kosaraju算法)
查看>>
SpringAop与AspectJ
查看>>
Leetcode 226: Invert Binary Tree
查看>>
http站点转https站点教程
查看>>
解决miner.start() 返回null
查看>>
关于MFC中窗口的销毁
查看>>
bzoj 2007: [Noi2010]海拔【最小割+dijskstra】
查看>>
BZOJ 1001--[BeiJing2006]狼抓兔子(最短路&对偶图)
查看>>
C# Dynamic通用反序列化Json类型并遍历属性比较
查看>>
128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
查看>>
定制jackson的自定义序列化(null值的处理)
查看>>
auth模块
查看>>
javascript keycode大全
查看>>
前台freemark获取后台的值
查看>>
log4j.properties的作用
查看>>
游戏偶感
查看>>
Leetcode: Unique Binary Search Trees II
查看>>