转:http://www.cnblogs.com/huhai121/p/3955755.html

NHibernate应用一:环境准备

  本章将介绍整个开发环境所需开发和数据库工具,以及数据库设计,后续章节将以当前数据库设计为示例而展开。

  一、环境配置:

  A、操作系统

    Win7旗舰版

  B、开发环境

    VS2010

    NHibernate4.0.0

  C、数据环境

    PowerDesigner 15.1

    Sql Server 2008

  

二、数据库设计:

  A、表结构设计:

  

  B、建表语句

    1)、客户表

      create table CustomerInfo (
         CustomerID           varchar(36)          not null,
         CustomerName         varchar(200)         not null,
         LinkPhone            varchar(20)          not null,
         LinkAddress          varchar(500)         not null,
         constraint PK_CUSTOMERINFO primary key (CustomerID)
      )      
      go

    2)、产品表

      create table ProductInfo (
         ProductID            varchar(36)          not null,
         ProductName          varchar(100)         not null,
         ProductPrice         decimal(18,2)        not null,
         constraint PK_PRODUCTINFO primary key (ProductID)
      )
      go

    3)、订单表

      create table OrderForm (
         OrderFormID          varchar(36)          not null,
         CustomerID           varchar(36)          null,
         OrderFormTime        datetime             not null,
         constraint PK_ORDERFORM primary key (OrderFormID)
      )
      go

    4)、订单明细表

      create table OrderProduct (
         OrderProductID       varchar(36)          not null,
         ProductID            varchar(36)          null,
         OrderFormID          varchar(36)          null,
         constraint PK_ORDERPRODUCT primary key (OrderProductID)
      )
      go

  三、软件配置

  要为 Microsoft Visual Studio 2010添加编写NHibernate配置文件智能提示的功能。只要在下载的NHibernate 里找到configuration.xsd 和nhibernate-mapping.xsd 两

  个文件并复制到X:\Program Files\Microsoft Visual Studio 9.0\Xml\Schemas 目录即可。

NHibernate应用二:第一个NHibernate程序

  当前期工作都准备完成后,将开始NHibernate的学习过程,而在第一个NHibernate程序中,将实现通过NHibernate根据客户编号对客户表进行单条记录的查询示例。该示例中,我们将按以下几部分说明。

  一、结构分析

    1.分层

      习惯了分层的体系结构,所以将第一个NHibernate程序按以下方式进行分层

     

    

      说明:

      A.Model层:模型层,是最底层,类似于传统三层中的实体层,用于持久化类和O/R Mapping操作。

      B.DAL层:DataAccessLayer层,高于Model层而低于App层,是数据访问层,定义对象的CRUD 操作。

      C.App层:应用层,最高层,用于跟用户的交互。

    2.引用

    Model层:引用Iesi.Collections.dll 程序集

    DAL层:引用NHibernate.dll 和Iesi.Collections.dll 程序集,引用Model层。

    App层:引用NHibernate.dll 和Iesi.Collections.dll 程序集,引用Model层和DAL层。

  

  二、Model层

    按简单传统.NET 对象(POCOs,Plain Old CLR Objects(Plain Ordinary CLR Objects))模型编程时需要持久化类,也可以说是DTO(Data Transfer Object,数据传

    送对象)模式(这是迄今为止可以工作的最简单方式)。在NHibernate 中,POCO 通过.NET 的属性机制存取数据,就可以把它映射成为数据库表。

    1.客户表的持久化类

       为Customer对象新建一个类文件,命名为CustomerEntity.cs

public class CustomerEntity{public virtual string CustomerID { get; set; }public virtual string CustomerName { get; set; }public virtual string LinkPhone { get; set; }public virtual string LinkAddress { get; set; }}

        说明:

      A. NHibernate 使用属性的getter 和setter 来实现持久化

      B. 属性可设置为public、internal、protected、protected internal 或private

      注意:

      NHibernate默认使用代理功能,要求持久化类不是 sealed 的,而且其公共方法、属性和事件声明为virtual。在这里,类中的字段要设置为virtual,否则出现异常,

      异常内容如下:

       “failed: NHibernate.InvalidProxyTypeException : The following types may not be used as proxies: DomainModel.Entities.Customer: method get_CustomerId

       should be virtual,method set_CustomerId should be virtual”。

     2. 客户表的映射文件

      为Customer对象新建一XML 文件,命名为Customer.hbm.xml

    

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"><class name ="NHibernateExample01.Model.Entity.CustomerEntity,NHibernateExample01.Model" table="CustomerInfo"><id name="CustomerID" column="CustomerID" type="string" length="36"><generator class ="native"></generator></id><property name="CustomerName" column ="CustomerName" type="string" length="200" /><property name ="LinkPhone" column="LinkPhone" type="string" length="20"/><property name ="LinkAddress" column="LinkAddress" type="string" length="500" /></class>
</hibernate-mapping>

      说明:

      A. XML文件的默认生成操作为“内容”,这里需要修改为“嵌入的资源”生成,否则出现异常,异常内容如下:

       Unable to locate persister for the entity named 'NHibernateExample01.Model.Entity.CustomerEntity'.

          The persister define the persistence strategy for an entity.

          Possible causes:

          The mapping for 'NHibernateExample01.Model.Entity.CustomerEntity' was not added to the NHibernate configuration

     B. 配置节< hibernate-mapping>中,urn:nhibernate-mapping-2.2是Xml的命名空间,跟NHibernate的DLL版本无关

     C. 配置节<hibernate-mapping>中,如果没有限定assembly 和namespace,那么在配置节<Class>中,需要完整限定名。否则出现异常,异常内容如下:

         Could not compile the mapping document: NHibernateExample01.Model.Entity.Customer.hbm.xml

     D. 配置节<generator>中,Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式根据不同的底层数据库采用不同的主键

           生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。

  三、DAL层

     1. 会话管理类

     整个NHibernate的数据流程如下:

     A.通过Configuration(NHibernate.Cfg.Configuration)构建ISessionFactory的属性和映射文件。

     B. 通过ISessionFactory生成Session。ISessionFactory 是线程安全的,很多线程可以同时访问它。

     C. Session进行一个单线程的单元操作(数据操作)。Session 不是线程安全的,它代表与数据库之间的一次操作,在所有的工作完成后,需要关闭。

     由此可见,ISessionFactory是整个数据访问的核心,由于它是线程安全性的,所以它可以做全局性对象,将使用单例模式来构建对它的管理。

public class SessionManager{private ISessionFactory _sessionFactory;public SessionManager(){_sessionFactory = GetSessionFactory();}private ISessionFactory GetSessionFactory(){return (new Configuration()).Configure().BuildSessionFactory();}public ISession GetSession(){return _sessionFactory.OpenSession();}}

   2. 数据访问类

    NHibernate数据访问是交由Session完成的,所以,数据访问的重点就在ISession上。

    在DAL层上新建一个CustomerDal.cs类,用来进行数据访问,编写一方法GetCustomerId 用于读取客户信息。

  

public class CustomerDal{private ISession _session;public ISession Session{set{_session = value;}}public CustomerDal(ISession session){_session = session;}public CustomerEntity GetCustomerByID(string customerID){return _session.Get<CustomerEntity>(customerID);}}

  4. App层

    1. NHibernate配置文件

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" ><session-factory><property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property><property name="connection.connection_string">server=.;database=NHibernateSample;uid=sa;pwd=123456;</property><property name="adonet.batch_size">10</property><property name="show_sql">true</property><property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property><property name="command_timeout">10</property><property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property><mapping assembly="NHibernateExample01.Model"/></session-factory>
</hibernate-configuration>

    说明:

    A.XML文件的默认“复制到输出目录”为“不复制”,这里需要修改为“始终复制”,否则出现异常,异常内容如下:

       failed: NHibernate.Cfg.HibernateConfigException : An exception occurredduring configuration of persistence layer. ---->

      System.IO.FileNotFoundException : 未能找到文件“NHibernateSample\DAL.Test\bin\Debug\hibernate.cfg.xml””

    B.配置文件会随着NHibernate的DLL版本不同而不同,需要详细查看NHibernate的DLL的Change日志。

    C.属性connection.provider设置了数据库连接提供者(一般不需要更改,除非你决定自己实现提供者)。

    D. 属性connection.driver_class设置了数据库的的驱动类(这里设置了SqlServer的驱动类)。

    E. 属性connection.connection_string是数据库的连接字符串。

    F. 属性show_sql设置是否在运行时是否在控制台显示正在执行的SQL语句(这个属性在调试程序时很有用)。

    G. 属性dialect是NHibernate方言, 可以让NHibernate使用某些特定的数据库平台的特性。

    H. 属性query.substitutions,把NHibernate查询中的一些短语替换为SQL短语(比如说短语可能是函数或者字符)。

    I.  属性mapping节点设置了将使用到的映射文件。

      2. 窗体文件内容

    

public partial class Form1 : Form{public Form1(){InitializeComponent();Init();}private void Init(){string CustomerID = "48CBCDFC-1AAA-4A08-9C9B-4578C6F59E8C";SessionManager _helper = new SessionManager();ISession _session = _helper.GetSession();CustomerDal _sample = new CustomerDal(_session);CustomerEntity entity = _sample.GetCustomerByID(CustomerID);if (entity != null){txtName.Text = entity.CustomerName;txtAddress.Text = entity.LinkAddress;txtPhone.Text = entity.LinkPhone;}}}

    说明:

      A.数据库中CustomerInfo表中有一条数据:

CustomerID

CustomerName

LinkPhone

LinkAddress

48CBCDFC-1AAA-4A08-9C9B-4578C6F59E8C

huhai

18618181513

内蒙古呼和浩特市赛罕区东影西路

    B. 显示结果如下:

      

转载于:https://www.cnblogs.com/cncz/p/3961626.html

NHibernate入门实例相关推荐

  1. Asp.Net MVC2.0 Url 路由入门---实例篇

    本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...

  2. SpringMVC 框架系列之初识与入门实例

    微信公众号:compassblog 欢迎关注.转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1.SpringMVC 概述 (1).什么是 MVC:Model-View-Control Co ...

  3. 《HFSS电磁仿真设计从入门到精通》一第2章 入门实例——T形波导的内场分析和优化设计...

    本节书摘来自异步社区<HFSS电磁仿真设计从入门到精通>一书中的第2章,作者 易迪拓培训 , 李明洋 , 刘敏,更多章节内容可以访问云栖社区"异步社区"公众号查看 第2 ...

  4. python爬虫实例-10个python爬虫入门实例

    昨天带伙伴萌学习python爬虫,准备了几个简单的入门实例 涉及主要知识点: web是如何交互的 requests库的get.post函数的应用 response对象的相关函数,属性 python文件 ...

  5. python爬虫程序实例-10个python爬虫入门实例

    作者:h3zh1 来源:cnblogs.com/h3zh1/p/12548946.html 今天为大家准备了几个简单的python爬虫入门实例,分享给大家. 涉及主要知识点:web是如何交互的 req ...

  6. ADO.NET Entity Data Model入门实例

    ADO.NET Entity Data Model入门实例 快速开发一个网站,最繁琐的地方可能要算数据库访问和ORM了,还好.net中这个很强大,可以省去好多体力劳动. 这里就给个快速使用ADO.NE ...

  7. Java Socket入门实例

    基于测试驱动的Socket入门实例(代码的具体功能可以看我的程序中的注释,不理解的可以短信我) 先看Server的代码: package socketStudy; import java.io.Buf ...

  8. linux Shell(脚本)编程入门实例讲解详解

    linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具.Shell不仅仅是命令的收集, ...

  9. Activiti工作流从入门到入土:入门实例

    一.前言 在上一节中我们对activiti进行了基本的介绍activiti进行了基本的介绍,同时介绍了基本的概念. 这一节,我将用一个入门程序,介绍如何使用activiti. 二.环境准备 2.1.编 ...

最新文章

  1. QThreadPool类和QtConcurrent命名空间
  2. 从命令行及java程序运行MyBatis Generator 1.3.x生成MyBatis3.x代码
  3. phpwind自定义推送模块
  4. 多态性与虚拟函数一个典型的例子第一步
  5. 整合rabbitmq+redis发送验证码消息
  6. 网络流 增广路 回退
  7. webpack 打包第三方库_webpack打包分离第三方库和业务代码
  8. jQuery Ajax – Servlets集成:构建完整的应用程序
  9. qt调用import sys库_Python模块之 sys 模块
  10. 计算机原理期中考试,计算机组成原理期中考试试题
  11. 敏捷个人课后练习五主题:改变
  12. ng机器学习视频笔记(三) ——线性回归的多变量、特征缩放、标准方程法
  13. python中label怎么绑定变量_Kivy将标签文本绑定到变量(仅限Python)
  14. python for 循环中使用星号(*),实现分组展开列表
  15. Delphi 连接 Excel
  16. opencv安装教程
  17. ANSI SQL之殇
  18. 电脑PHP动画制作画板,html5教程制作简单画板代码分享
  19. 动态规划问题之求解数列中递增数列的长度
  20. 微信开发常用文档及参考资料

热门文章

  1. fatal: remote origin already exists. (远程来源已经存在 解决办法)
  2. Ubuntu18.04 安装nextcloud
  3. Android开发笔记(七十三)代码混淆与反破解
  4. Nginx 上传图片500错误 open() /var/lib/nginx/tmp/
  5. Linux基础 -- vim编辑器3 -- 查找和替换
  6. C++ string字符串的增删改查
  7. leetcode-125 Valid Palindrome
  8. Httpd2.4简介及CenOS6.6下编译安装
  9. C#使用Advanced CSharp Messenger
  10. 【图文详解】,cisco,***配置