1. 什么是NHibernate
NHibernate 是一个面向.NET 环境的对象/关系数据库映射工具。对象关系映射(O/R Mapping,Object Relational Mapping)表示一种技术,用来把对象模型表示的对象映射到基于SQL 的关系模型数据结构中去。
2. NHibernate中的查询方法
- NHibernate查询语言(HQL,NHibernate Query Language)
- 条件查询(Criteria API,Query By Example(QBE)是Criteria API的一种特殊情况)
- 原生SQL(Literal SQL,T-SQL、PL/SQL)
3. NHibernate中的事务
- NHibernate使用事务要使用using强制资源清理和异常机制
using (ITransaction tx = _session.BeginTransaction()) { try { //一些保存、更新、删除等操作 tx.Commit(); } catch (HibernateException) { tx.Rollback(); throw; } }
-
在任何时候都要使用事务,即使是在读取、查询数据的时候,为什么呢?因为你不清楚数据库什么时候操作失败,如何恢复原来数据。而NHibernate中的事务(可以通过 tx.Rollback()方法),帮助我们完成这些事情。
4. NHibernate并发控制
- 悲观并发控制
- 乐观并发控制(NHibernate支持)
5. NHibernate关系
- NHibernate支持/定义的几种类型的集合:
Bag:对象集合,每个元素可以重复。例如{1,2,2,6,0,0},在.Net中相当于IList或者IList<T>实现。
Set:对象集合,每个元素必须唯一。例如{1,2,5,6},在.Net中相当于ISet或者ISet<T>实现,Iesi.Collections.dll程序集提供ISet集合。
List:整数索引对象集合,每个元素可以重复。例如{{1,"YJingLee"},{2,"CnBlogs"},{3,"LiYongJing"}},在.Net中相当于ArraryList或者 List<T>实现。
Map:键值对集合。例如{{"YJingLee",5},{"CnBlogs",7},{"LiYongJing",6}},在.Net中相当于HashTable或者IDictionary<Tkey,TValue>实现。 - Customer与Order的一对多关系映射:
Customer.cs
using Iesi.Collections.Generic; namespace DomainModel.Entities { public class Customer { public virtual int CustomerId { get; set; } public virtual string Firstname { get; set; } public virtual string Lastname { get; set; } //一对多关系:Customer有一个或多个Orders public virtual ISet<Order> Orders { get; set; } } }
Customer.hbm.xml
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel"> <class name ="DomainModel.Entities.Customer,DomainModel" table="Customer"> <id name="CustomerId" column="CustomerId" type="Int32" unsaved-value="0"> <generator class ="native"></generator> </id> <property name="Firstname" column ="Firstname" type="string" length="50" not-null="false"/> <property name ="Lastname" column="Lastname" type="string" length="50" not-null="false"/> <!--一对多关系:Customer有一个或多个Orders--> <set name="Orders" table="`Order`" generic="true" inverse="true"> <key column="Customer" foreign-key="FK_CustomerOrders"/> <one-to-many class="DomainModel.Entities.Order,DomainModel"/> </set> </class> </hibernate-mapping>
- Customer与Order的一对多关系映射:
Order.cs
namespace DomainModel.Entities { public class Order { public virtual int OrderId { get; set; } public virtual DateTime OrderDate { get; set; } //多对一关系:Orders属于一个Customer public virtual Customer Customer { get; set; } } }
Order.hbm.xml
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel"> <class name="DomainModel.Entities.Order,DomainModel" table="`Order`" > <id name="OrderId" column="OrderId" type="Int32" unsaved-value="0"> <generator class="native" /> </id> <property name="OrderDate" column="OrderDate" type="DateTime" not-null="true" /> <!--多对一关系:Orders属于一个Customer--> <many-to-one name="Customer" column="Customer" not-null="true" class="DomainModel.Entities.Customer,DomainModel" foreign-key="FK_CustomerOrders" /> </class> </hibernate-mapping>
- Order与Product的多对多关系映射:
Order.cs
namespace DomainModel.Entities { public class Order { public virtual int OrderId { get; set; } public virtual DateTime OrderDate { get; set; } //多对一关系:Orders属于一个Customer public virtual Customer Customer { get; set; } //多对多关系:Order有多个Products public virtual IList<Product> Products { get; set; } } }
Order.hbm.xml
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel"> <class name="DomainModel.Entities.Order,DomainModel" table="`Order`" > <id name="OrderId" column="OrderId" type="Int32" unsaved-value="0"> <generator class="native" /> </id> <property name="OrderDate" column="OrderDate" type="DateTime" not-null="true" /> <!--多对一关系:Orders属于一个Customer--> <many-to-one name="Customer" column="Customer" not-null="true" class="DomainModel.Entities.Customer,DomainModel" foreign-key="FK_CustomerOrders" /> <!--多对多关系:Order有多个Products--> <bag name="Products" generic="true" table="OrderProduct"> <key column="`Order`" foreign-key="FK_OrderProducts"/> <many-to-many column="Product" class ="DomainModel.Entities.Product,DomainModel" foreign-key="FK_ProductOrders"/> </bag> </class> </hibernate-mapping>
- Order与Product的多对多关系映射
Product.cs
namespace DomainModel.Entities { public class Product { public virtual int ProductId { get; set; } public virtual string Name { get; set; } public virtual float Cost { get; set; } //多对多关系:Product属于多个Orders public virtual IList<Order> Orders { get; set; } } }
Product.hbm.xml
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel"> <class name="DomainModel.Entities.Product,DomainModel" table="Product"> <id name="ProductId" column ="ProductId" type="Int32" unsaved-value="0"> <generator class="native"/> </id> <property name="Name" column="Name" type="string" not-null="true" length="50"/> <property name="Cost" column="Cost" type="float" not-null="true"/> <!--多对多关系:Product属于多个Orders--> <bag name="Orders" generic="true" table="OrderProduct"> <key column="Product" foreign-key="FK_ProductOrders"/> <many-to-many column="`Order`" class="DomainModel.Entities.Order,DomainModel" foreign-key="FK_OrderProducts"/> </bag> </class> </hibernate-mapping>
6. NHibernate的加载机制
- 延迟加载
使用代理模式 - 立即加载
可选的lazy属性
NHibernate提供的实用类
HQL抓取策略
7. NHibernate中使用视图
在NHibernate中使用视图,同表类似,只是属性访问权限不同罢了。视图是只读的,所以把属性的Setter设置为private访问权限。
8. NHibernate中使用存储过程
引自:http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html