C# 数据操作系列 - 11 NHibernate 配置和结构介绍
C# 数据操作系列 - 11 NHibernate 配置和结构介绍
- 前言
今天是NHibernate的第二篇内容,通过上一篇的内容,我们初步了解了NHibernate的创建和使用。这一篇,我继续探索NHibernate背后的秘密。嗯,就是这样。 - NHibernate结构
先给小伙伴们放个图:
这是NHibernate的整体结构图。NHibernate通过ADO.NET 建立访问数据库的连接,然后封装了一个Transaction(事务)工厂和一个Session工厂。每次操作的时候,通过两个工厂获取对应的Session/Transaction示例操作数据对象。
ISessionFactory - NHibernate.ISessionFactory:
一个基于单数据库的已编译的映射缓存,它是持久不变的且线程安全(额,这句话是从它的文档翻译过来的)。是一个提供ISession的工厂类,同时也是一个 IConnectionProvider的客户端。可以设置一个在事务之间的进程级或集群级的二级缓存。
ISession - NHibernate.ISession:
一个单线程、短生命周期的对象,表示从应用程序和数据持久化之间一个连接。一个ADO.NET连接的封装,用来提供ITransaction的工厂。提供了一个通过主键检索对象和导航链接查询对象时的一级缓存。也就是EF Core中的导航属性。
Persistent Objects and Collections(持久化对象和集合):
一些单线程、短生命周期对象其中包含持久化状态和业务方法。它们可能只是一些普通的POCO,仅仅是与ISession中关联起来了。只要ISession关闭了,这些对象就可以被分离出来然后可以在应用层的任意地方使用。
Transient Objects and Collections(临时对象和集合):
表示临时的未被ISession托管的持久化对象,它们被应用层临时创建但直到ISession关闭都不会被持久化。
ITransaction - NHibernate.ITransaction:
这个是可选的。表示一个单线程、短生命周期的对象,被应用程序用来限制一个原子的工作单元,基于ADO.NET 的Transaction的抽象。一个ISession可能会开启多个事务,Transaction scopes may be used instead(原话是这个,大意是可以改用事务作用域)。
IConnectionProvider - NHibernate.Connection.IConnectionProvider:
也是可选的,是一个用来创建ADO.NET Connection和Command的工厂。基于DbConnection和DbCommand实现,并非直接暴露给应用程序,但是可以由开发者对其进行扩展或实现。
IDriver -NHibernate.Driver.IDriver:
可选的,驱动接口,用来封装隐藏不同ADO.NET 数据提供程序之间的不同。例如:参数化等。
ITransactionFactory - NHibernate.Transaction.ITransactionFactory:
可选的,事务实现工厂,不对应用程序公开,但开发者可以对其进行扩展或实现。
- 实例状态
在NHibernate中,一个可持久化的对象有三种不同的状态,依据与持久化上下文之间的关系不同,其中ISession就是一个持久化上下文。状态分为以下三种:
transient 暂存的、临时的 该状态的对象并没有被持久化上下文捕获到,简单来讲就是刚被创建,还没有从数据库/持久化上下文中获取到主键信息。
persistent 持久化的 该状态的对象表示已经被上下文正确获取到了,持久化上下文能够监控到对象的变化。持久化上下文中持有一个指向该对象的引用。这种状态通常是从数据库中获取到数据或者新建的数据附加到了上下文中。
detached 游离态 该状态的对象是从上下文中分离出来的,有了数据库主键,曾经或现在仍然有一条数据库记录与之对应。造成的原因可能有,上下文关闭了;该对象是在另一个上下文中持久化的,它对于当前上下文是游离态的。
- 配置项介绍
在上一篇文章中,我们介绍了一下如何设置NHibernate的基本配置项,但是并未对配置项进行深入。这一节,将带领大家看一下NHibernate中我们常用的配置,因为配置项有很多,但一大部分通常情况都遇不到使用它的时候。
dialect
数据库方言,表示NHibernate连接的数据库是什么,该用哪种格式解析关系映射到数据库SQL语句
default_schema
默认的schema,用来设置连接字符串连接的数据库默认的schema。
connection.provider
数据库连接的提供程序,默认是NHibernate.Connection.DriverConnectionProvider. 填继承自 IConnectionProvider 的实现类
connection.connection_string
数据库连接字符串
connection.connection_string_name
数据库连接字符串的名称,指的是配置在程序的配置文件中 connectionStrings节点的数据连接字符串。
max_fetch_depth
最大递归深度,表示一次查询中直接加载的导航属性深度。默认是不直接加载导航属性,基于延迟加载的逻辑,由实际使用时才从数据库中加载数据。
show_sql
是否在控制台中打印转换的SQL语句,一般在调试的过程中会设置为true,用来确认生成的SQL是否正确等。
hbm2ddl.auto
该值表示每次ISessionFactory创建的时候,是否自动生成DDL语句并提交数据库执行。默认是空,表示不会强制更新数据库。有几个候选值:create或create-drop、update等。其中create表示每次只创建新增的;create-drop表示每次ISessionFactory创建时创建表 ,ISessionFactory关闭时,删除表;其中update表示每次都会将DDL SQL更新到数据库中。(我记得有update,但文档中没有这个选项)
以上是我们常用的一些配置内容,当然还有更多的配置,我并没有在这里一一讲明,留待以后吧。
- 总结
这是一篇枯燥乏味的说明文,主要介绍了Nhibernate的基本内容。下一章我们来试试,如何创建Nhibernate的映射配置。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
javascript有几种继承方式?
都0202年了,你还不知道javascript有几种继承方式? 前言 当面试官问你:你了解js哪些继承方式?es6的class继承是如何实现的?你心中有很清晰的答案吗?如果没有的话,可以通过阅读本文,帮助你更深刻地理解js的所有继承方式。 js继承总共分成5种,包括构造函数式继承、原型链式继承、组合式继承、寄生式继承和寄生组合式继承。 构造函数式继承 首先来看第一种,构造函数式继承,顾名思义,也就是利用函数去实现继承; 假设我们现在有一个父类函数: // 父类构造函数function Parent(color) { this.color = color; this.print = function() { console.log(this.color); } } 现在要编写一个子类函数来继承这个父类,如下: // 子类构造函数function Son(color) { Parent.call(this, color); }上面代码可以看到,子类Son是通过Parent.call的方式去调用父类构造函数,然后把this对象传进去,执行父类构造函数之后,子类Son就拥有了父类...
- 下一篇
【python接口自动化】- openpyxl读取excel数据
【python接口自动化】- openpyxl读取excel数据 前言:目前我们进行测试时用于存储测试数据的软件几乎都是excel,excel方便存储和管理数据,读取数据时也比较清晰,测试时我们需要从excel从读取测试数据,结束后还需把测试结果写入到excel中,读取这一动作以往都是通过人工来操作,学会使用openpyxl后,就可以实现自动化地读取数据,解放双手。 1|0openpyxl简单介绍 openpyxl是一个开源项目,它是一个用于读取/写入Excel 2010文档(如xlsx、xlsm、xltx、xltm文件 )的Python库,如果要处理更早格式的Excel文档(xls),需要用到其它库(如:xlrd、xlwt等),这是openpyxl比较其他模块的不足之处。openpyxl是一款比较综合的工具,不仅能够同时读取和修改Excel文档,而且可以对Excel文件内单元格进行详细设置,包括单元格样式等内容,甚至还支持图表插入、打印设置等内容。 python中与excel操作相关的模块: 📔 xlrd库:从excel中读取数据,支持xls、xlsx格式📔 xlwt库:...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合Redis,开启缓存,提高访问速度
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- CentOS8安装Docker,最新的服务器搭配容器使用