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/huhai121/p/3958263.html
NHibernate应用二:第一个NHibernate程序相关推荐
- JavaScript二(第一个js程序)
一.<script>xxxx</script>标签解析 1.charset :可选,表示通过src属性指定的字符集,由于大多数浏览器忽略它,所以很少有人用它 2.defer:可 ...
- 【Golang第1~3章:基础】如何安装golang、第一个GO程序、golang的基础
介绍 本人是个菜鸡,这个是在B站上看边看视频边做的笔记,这一章是编程语言的基础 有变量.常量.数据类型.指针.标识符.运算符.流程控制,具体请看[文章目录] 配套视频自己去B站里面搜[go语言],最高 ...
- NHibernate从入门到精通系列(3)——第一个NHibernate应用程序
内容摘要 准备工作 开发流程 程序开发 一.准备工作 1.1开发环境 开发工具:VS2008以上,我使用的是VS2010 数据库:任意关系型数据库,我使用的是SQL Server 2005 Expre ...
- SpringBoot系列二:搭建自己的第一个SpringBoot程序
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 一.根据官网手工搭建(http://projects.spring.io/spring-boot/#quick-start) 1 ...
- Python学习笔记(二) 第一个Python程序 、 Python基础
Python_02 第一个Python程序 .python基础 第一个python程序 使用python命令行交互模式 使用文本编辑器编辑 输入和输出 python基础 数据类型和变量 字符串和编码 ...
- 编写一个 spootboot 程序,有二个方法,一个问早上好,一个说再见
目的: 编写第一个 spootboot 程序 完成内容 新建 maven 项目 配置 pom.xml 开发一个 controller 类 有二个方法,一个问早上好,一个说再见 开发主类 运行测试,分别 ...
- SharePoint 集成PowerApps和Flow教程(二,第一个PowerApps程序)
SharePoint 集成PowerApps和Flow教程(二,第一个PowerApps程序) 使用Excel 数据创建一个APP. 我的第一个PowerApp使用的Excel文件作为数据源,数据文件 ...
- Zigbee之旅(二):第一个CC2430程序——LED灯闪烁实验
Zigbee之旅(二):第一个CC2430程序--LED灯闪烁实验 一.承上启下 在上一篇文章<Zigbee之旅(一):开天辟地>中,我们简要的介绍了Zigbee,以及其开发环境的搭建.O ...
- acr单片机c语言开发入门,AutoCAD2013二次开发C语言第一个ObjectArx2013程序HelloWorld.docx...
AutoCAD2013 二次开发 C++语言的第一个 ObjectArx2013 程序 HelloWorld .八,.■ 刖言 AutoCAD2013 二次开发 C++语言的 ObjectArx SD ...
最新文章
- 不需要显示地图 就获得用户当前经纬度 超简单的方法
- python序列化和反序列化_python反序列化免杀
- 09、redis哨兵的多个核心底层原理的深入解析(包含slave选举算法)
- 《大数据系统构建:可扩展实时数据系统构建原理与最佳实践》一1.5 大数据系统应有的属性...
- python 爬虫抓站
- python socket编程:实现redirect函数、cookie和session
- (转)HTTP 长连接和短连接
- HBase权威指南 高清中文版 PDF(来自linuxidc)
- [转] css3变形属性transform
- Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令
- C#反射获取 所有字段 及 私有字段
- HD AUDIO For XP SP3 声卡修正补丁下载
- python电影爬虫背景介绍_Python爬虫入门教程01之爬取豆瓣Top电影
- uni-app使用ucharts地图(主要微信小程序-初步使用)
- tds与oracle,oracle和sqlserver找不到字段的错误
- 2021年新媒体运营不可缺少的24大类工具!
- powerquery分组_Power Query系列 - 排序Ranking
- 计算机的组合快捷键,Win10的电脑的快捷键有哪些?Windows10常用组合快捷键大全...
- 拼多多蓝海词数据分析:如何优化拼多多关键词?拼多多标题关键词优化方法。
- Mycat生产实践---性能调优
热门文章
- 使用jpcap获取网卡硬件
- ASP.NET Core 框架源码地址
- 2.select_基础运用
- 第二轮冲刺-Runner站立会议04
- 定义一个大整数类,并重载乘法*运算符
- RestSharp .net 轻量级rest客户端
- 随手正则写的 CSDN【只看楼主】功能
- 8.1 A Bayesian Methodology for Systemic Risk Assessment in Financial Networks(4)
- springcloud 整合 gateway_GitHub上最火的SpringCloud微服务商城系统项目,附全套教程
- 1.15 总结-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授