摘要:
本文约定:1. Nhibernate简写为NHB;2. 本文例子的开发平台为win2000xp+sp2, sql server2000, Nhibernate0.9.1.0;3. 使用SQL Server自带的罗斯文商贸数据库(Northwind),中文版;4. 本文例子是基于测试驱动开发(TDD)的,因此建议使用NUnit2.2和Log4Net (如果你不熟悉NUnit,不要紧啊,趁此机会学习点... 阅读全文
摘要:
多对多关系在数据库也是比较常见的,它通过一个中间表将两个主表关联起来。下面来看看多对多关联在nh的实现,示例是一个User和Group之间的多对多关联。先来看看User类的映射信息: 在多对多定义中,定义了中间表为UserGroups,此表只有两个字段:user_id和group_id;用于关联Users和Groups表。User的定义: public class User { public ... 阅读全文
摘要:
MAP文件,可以充当一个数据库的描述,例如数据库的基本关系,类型的定义,一般情况下,当给出了MAP文件,您完全可以根据它生成对应的数据库. using NHibernate;using NHibernate.Cfg;using NHibernate.Dialect;using NHibernate.Tool.hbm2ddl; using System ;using System.Reflecti... 阅读全文
摘要:
在数据库的多对多关系中, 实现方法是通过一个额外的关联表将两个主表关联起来,关联表中只保存两个主表的主健,显然, 主表与关联表是一对多的关系. 这样两个主表就通过这个关联表构成了一个多对多的关系. 典型的例子就是用户和权限了, 每个用户可以有多个权限, 而每个权限也可以分配给多个用户. 通过一个用户权限表就可以实现这样的要求.因为关联表并没有其它任何信息, 所以在NH中它不能算是一个持久对象, 没... 阅读全文
摘要:
nh中的one-to-one(一对一)映射有两种情况, 一种是主键(PrimaryKey)关联, 一种是外健(ForeignKey)关联. 在主键关联的情况下, 显然必须有一个主键是根据别一个主键而来的, nh通过一个特殊的方式来处理这种情况, 要注意的是两个主健名称必须同名.而外健一对一关联, 需要在one-to-one配置中定义一个property-ref属性, 这个配置属性在当前版本的nh中... 阅读全文
摘要:
nh会话提供一种使用表达式(就像SQL语句的where表达式)来载入数据的方法, 以取得满足条件的对象集合。 通过CreateCriteria方法, 可以取得一个ICriteria接口, 这个接口用于操作表达式和排序字段. 由CriteriaImpl类实现,此类加有Internal修饰,因此不能在程序集外显示创建, CreateCriteria方法需要一个要加载对象类型的参数.这里列出ICrite... 阅读全文
摘要:
数据库中的主从表就是一对多的关系了,这种关系在按范式设计的数据库中是十分常见的.在nh中,通过one-to-many映射可以十分方便的处理这种关系,包括级联更新,删除等. 下面以一个简单的主从表来说明one-to-many的应用. 先来看看Parent类的映射信息: one-to-many关系必须通过一个nh的集合类型来定义, 这... 阅读全文
摘要:
在有些时候,可能需要直接执行SQL语句、存储过程等,但nhibernate并没有提供一种让我们执行SQL语句的方法,不过可以通过一些间接的方法来实现。1. IDriver接口IDriver接口就是数据访问的驱动器,对于不同的数据提供者(SqlClient, OleDb等)就有不同的驱动器,与SqlClient对应的是SqlClientDriver, 而与OleDb对应的就是OleDbDriver。... 阅读全文
摘要:
对数据库的操作是少不了事务处理的,事务能保整数据完整性和有效性。 在nh中,使用Transaction对象对.net的事务对象(实现了IDbTransaction接口的对象)进行了包装。在nh中,一个典型的事务处理是这样的(见ISession.cs的注释)ISession sess = factory.OpenSession();Transaction tx;try { tx = sess.B... 阅读全文
摘要:
本文将对HQL查询文本的解析过程进行分析,这个可以说是NH中比较复杂的一块了(个人认为),涉及到的类也比较多。建议阅读之前先深呼吸十下,看完之后脑袋成浆糊可不要找我哟。:-)在HQL数据加载一文中,我们有提到QueryTranslator的创建过程,代码如下://*** SessionFactoryImpl.cs 429行 *** private QueryTranslator GetQuery... 阅读全文
摘要:
NH中,HQL是一个十分强大的面向对象的查询语言,简单的说,就是不需要使用实际的表名和列名来查询数据,而改用类名和属性。有两种方式来执行HQL数据加载,一种是直接使用ISession的Find方法,另一种是使用IQuery接口。IQuery接口提供了一些额外的设置,最重要的就是分页了,这个和ICriteria差不多,另外一些就是设置参数的值了。IQuery最终还是会调用ISession的Find方... 阅读全文
摘要:
ICriteria是使用Expression进行数据加载的接口, 提供了设置表达式(Expression), 排序方式(Order), 分页记录等操作.它使用一种类似于SQL语句where表达表的方式来加载满足条件的数据. 下面以一个查询Username为billy, Password为test的用户为例来分析nh中Criteria数据加载是怎样工作的. 查询代码如下: Expression ex... 阅读全文
摘要:
当持久化对象时,显然必须存在把记录的值赋值到对象属性和取得对象属性的值用于持久化操作,对于更新操作,还需要检查对象的值是否已发生变化,即是否为Dirty,这些操作都是由对象的持久化类来完成的。有关持久化类可参考《会话和持久化操作》一文。下面对NH的源码进行分析,以了解NH中数据加载和更新的过程。一、持久对象加载先来想像一下对象的加载过程(Load).1. 根据对象Id从数据库取得记录;2. 使用默... 阅读全文
摘要:
对象标识相当于数据表中的主键,在持久化中起着十分重要的作用,nhibernate通过对象标识来辨别两个持久对象是否相等。在映射文件中,通过id属性来定义对象标识,内容如下: 其中unsaved-value属性用来指明对象未持久化时的值,如果此值与未持久化的对象标识值不符,将无法save对象,generator用于指定标识对象的类型,常用的有identity, assigned等。标识对象为实现... 阅读全文
摘要:
持久化操作由与持久对象关联的持久化类来完成,持久化类是实现IClassPersister接口的类,每个持久对象都有一个关联的持久化类,这些持久化类存储在会话工厂的classPersisters集合中,nhibernate允许用户通过自定义的持久化类来持久化数据。IClassPersister接口定义了基本的CRUD操作,在nhibernate中由AbstractEntityPersister类实现... 阅读全文
摘要:
会话是nhibernate中的主要接口,也是我们进行持久化操作和数据加载的主要接口,ISession在IClassPersister、ITransaction、ICriteria和IQuery之间起着协调者的作用。会话对象通过调用会话工厂的OpenSession方法获得,OpenSession方法有一个参数interceptor,这是一个拦截器,由实现了IInterceptor接口的对象来完成,比... 阅读全文
摘要:
会话工厂是NHibernate中的关键类,它与数据库连接、数据库事务等进行交互,还存储着与所有持久对象类型关联的持久化对象,持久化类是持久化的关键,它实现基本的CRUD操作。当用户需要持久操作时,由会话工厂创建一个会话供用户进行持久操作。1. 会话工厂的创建会话工厂由ISessionFactory接口实现,由Configuration的BuildSessionFactory方法创建,会话工厂应该使... 阅读全文
摘要:
配置信息用于指定NH以何种方式访问数据库, 根据这些配置信息, NH动态的创建数据访问对象并与数据库进行交互. 除了.net类库自带的Odbc, OleDb, OracleClient和SqlClient访问方式外, 在0.2版中, NH增加了用于访问MySQL和Firebird的访问方式, 这两种访问方式由第三方组件提供, mono的用户应该高兴了. :) NH的配置有两种存放方式 存放在应... 阅读全文
摘要:
为了让大家更好的了解NHibernate的功能和工作原理, 我们将对NHibernate的源代码进行全面的分析. 在此系列文章中, 我们做出以下约定: 为简化输入, 文中NHibernate均以NH代替; 若无特殊说明, 均以NHibernate 0.2.0.0的源代码为准; 文中在引用NHibernate的源代码段时, 均会在代码段的上文给出所在的文件名称和起始的行号; 阅读全文