NHibernate历程2
更新时间:2024-03-30 13:04:01 阅读量: 综合文库 文档下载
- 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
=\l\ table=\>
说明:
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. 配置节
namespace,那么在配置节
Could not compile the mapping document:
NHibernateExample01.Model.Entity.Customer.hbm.xml
D. 配置节
选择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
4. App层 1. NHibernate
配置文件
server=.;database=NHibernateSample;uid=sa;pwd=123456;
NHibernate.Dialect.MsSql2008Dialect
说明:
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 =
\;
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-4A0huhai 8-9C9B-4578C6F59E8C 18618181513 内蒙古呼和浩特市赛罕区东影西路 B. 显示结果如下:
正在阅读:
NHibernate历程203-30
满堂支撑架构造要求规范09-13
集团公司对标先进学习心得体会精选三篇04-11
语法隐喻视角下的新闻社论翻译06-11
微机原理及汇编语言课后习题解答04-28
浅谈简笔画在小学语文课堂中的运用10-17
压轴题:动点中的面积问题练习题(含答案)11-13
森林资源管理最优化及可持续发展03-15
学龄前儿童缺铁性贫血及其危险因素调查04-05
《水利工程概论》复习题(2)05-20
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- NHibernate
- 历程
- 安全标准化手册
- 2018华工会计信息系统随堂练习
- 哲学通论试题
- 湖北省宜都市红花套镇初级中学八年级语文上册 第三单元 第12课《
- 为什么我们要进行土地整治规划
- 建筑电气毕业答辩 问题整理
- 分析化学问题与习题3
- 洗油加工工艺介绍
- 我国机械制造业管理信息化特点及发展趋势 论文
- 《魔兽世界》7.0快速刷堕夜精灵声望方法 堕夜精灵声望怎么刷
- 基于OPNET的网络模型仿真
- 水龙头不再哭泣
- 江苏省淮安市吴承恩中学2016届高三语文二轮复习学案纵向层递式议
- 青海省水力发电厂名录2018版231家
- 2018年高考政治一轮复习之专题检测 价值规律及其表现形式(第02
- 医院医护紧急求助报警应急系统 - 图文
- 新视野听说第一册听力文本Unit 7
- ABAQUS分析步骤
- 苏亚星多媒体教学网 V8.1(电子教室版)功能规格书
- 白市水电厂1、2号发电机一次通流试验方案