NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。

优点:

(1)NHibernate不仅仅管理.NET类到数据库表的映射(包括.NET 数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度减少开发时人工使用SQL和ADO.NET处理数据的时间。

(2)面向对象:NHiberante的使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想。

(3)透明持久化:是他们正与(仅仅一个)Session相关联。一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。

缺点:

(1)内存消耗:直接使用“SqlHelper、DAL、BLL”无疑是最省内存的。使用NHibernate后,内存开销比较大,这点是毋庸置疑的。

(2)批量数据库的处理:由于NHibernate是基于面向对象的ORM框架,处理数据库的方式是针对单个对象的。对数据库的增、删、改都是正对一条记录而言。对于批量修改、删除数据,不适合用NHiberante。这也是所有OR框架弱点。

(3)表关系比较混乱时也不适合使用NHiberante。NHibernate只适合于表与表的关系比较明确的环境中。如本应该建立外键的,没有建立外键。这时使用NHiberante不仅没有减少工作量,反而增加了工作量。

使用NHiberante做一个简单实例:

(1)添加引用程序集:

(2)编写一个持久化类:

public class Classes
{
public Classes()
{
}
#region Classes属性定义
private int _CID;
/// <summary>
/// 班级表ID
/// </summary>
public virtual int CID
{
get
{
return _CID;
}
set
{
_CID = value;
}
}
private string _CName;
/// <summary>
/// 班级名称
/// </summary>
public virtual string CName
{
get
{
return _CName;
}
set
{
_CName = value;
}
}
private int _CCount;
/// <summary>
/// 班级人数
/// </summary>
public virtual int CCount
{
get
{
return _CCount;
}
set
{
_CCount = value;
}
}
private string _CImg;
/// <summary>
/// 班级Logo图片
/// </summary>
public virtual string CImg
{
get
{
return _CImg;
}
set
{
_CImg = value;
}
}
private bool _CIsDel;
/// <summary>
/// 删除标志
/// </summary>
public virtual bool CIsDel
{
get
{
return _CIsDel;
}
set
{
_CIsDel = value;
}
}
private DateTime _CAddTime;
/// <summary>
/// 录入时间
/// </summary>
public virtual DateTime CAddTime
{
get
{
return _CAddTime;
}
set
{
_CAddTime = value;
}
}
#endregion
}

  NHibernate对属性使用的类型不加任何限制。所有的.NET类型和原始类型(比如string,char和DateTime)都可以被映射,也包括.Net 集合(System.Collections)中的类。你可以把它们映射成为值,值集合,或者与其他实体类相关联。Id是一个特殊的属性,代表了这个类的数据库标识符(主键)。为了让上面提到运行时类增强功能生效,NHibernate持久化类的所有的public的属性必须声明为virtual。

(3)编写xml文件映射:xml文件必须以“类名.hbm.xml”格式命名;创建解决方案文件夹放入文件如下,则编写xml时就会有智能提示:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="HeiMaNH" assembly="HeiMaNH">
<class name="HeiMaNH.Classes,HeiMaNH" table="Classes">
<id name="CID" column="CID" type="Int32">
<generator class="identity" />
</id>
<property name="CName" column="CName" type="String" length="" />
<property name="CCount" column="CCount" type="Int32" length="" />
<property name="CImg" column="CImg" type="String" length="" />
<property name="CIsDel" column="CIsDel" type="Boolean" length="" />
<property name="CAddTime" column="CAddTime" type="DateTime" length="" /> </class>
</hibernate-mapping>

(4)使用NHibernate的ISession(持久化管理器), 我们通过ISession来从数据库中存取数据

 protected void Page_Load(object sender, EventArgs e)
{
//1.创建 会话 工厂(是可以被共享使用的, 是线程安全的)
ISessionFactory factory = new Configuration().Configure().BuildSessionFactory();
//2.创建 会话(非共享使用,非线程安全,但是如果针对当前请求里的每个数据库操作都创建 会话,则极度浪费资源,所以,最好是 针对每次请求 只创建一个 会话)
ISession sess = factory.OpenSession();
//HttpContext.Current.Items.Add("nfsession", sess);
//3.创建查询对象 (hql-hibernate query language)
IQuery query = sess.CreateQuery("from Classes c where c.CIsDel = false");
//3.2更加面向对象化的查询方式
//ICriteria crit = sess.CreateCriteria(typeof(Classes));
//crit.Add(Restrictions.Eq("CIsDel", false));
//crit.Add(Restrictions.Eq("CName", "刘德华2"));
//IList<Classes> list = crit.List<Classes>();
//4.获得查询结果
IList<Classes> list = query.List<Classes>();
rptList.DataSource = list;
rptList.DataBind();
}

对象状态:

瞬时(transient)
数据库中没有数据与之对应,超过作用域会被垃圾回收.
其实 一般就是 new出来 且与 ISession没有关联的对象;
 
持久(persistent)
数据库中有数据与之对应,当前与ISession关联,并且相关联的isession也没有关闭,事物没有提交:持久对象状态发生改变,在事务提交时会影响到数据库(nhibernate能检测到改变);
 
脱管(detached-脱离了nh的管理)
数据库中有数据与之对应,但当前没有session与之关联;脱管对象状态发生改变,nhibernate不能检测到;
 
HQL和Criteria
 
HQL(Hibernate Query Language)
面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了C#类和属性其他部分不区分大小写);
HQL中查的是对象而不是表,并且支持多态;
HQL主要通过Query来操作,Query的创建方式:
IQuery q = sess.CreateQuery(hql);
from Person
from User u where u.name=:name
from User u where u.name=:name and u.birthday<:birthday
 
Criteria
Criteria 是一种比HQL更面向对象的查询方式;
ICriteria crit = sess.CreateCriteria(typeof(User));
简单属性条件如:crit.Add(Restrictions.eq(proName,value));
crit.Add(Restrictions.eqProperty(proName,otherProName));

使用NHibernate进行关联映射

(1)多对一(Student - Classes)
(2)一对多(Classes-Student)
(3)一对一(Student-IdCard)
(4)多对多(Student-Subject)
(5)集合映射(Set, List, Map, Bag)
(6)级联:Cascade(Classes-Student)
 

NHibernate学习系列一的更多相关文章

  1. MVC4+Springnet+Nhibernate学习系列随笔(一)

    Springnet与asp.net mvc4集成大体步骤 1.首先要在MVC项目中引用的两个程序集(Spring.Web与Spring.Web.Mvc4) 集 2.修改MVC项目的Global.asa ...

  2. Entity Framework 6.1 学习系列1--概况、安装

    原文:Entity Framework 6.1 学习系列1--概况.安装 Entity Framework:实体框架,看名字就知道是针对模型数据的.这是MS推出的一款ORM工具. 与NHibernat ...

  3. ABP架构学习系列一 整体项目结构及目录

    本系列是基于aspnetboilerplate-0.8.4.0版本写的,其中原因是由于较高的版本太抽象难以理解和分析,对于还菜菜的我要花更多的时间去学习. abp的源码分析学习主要来源于 HK Zha ...

  4. 分布式学习系列【dubbo入门实践】

    分布式学习系列[dubbo入门实践] dubbo架构 组成部分:provider,consumer,registry,monitor: provider,consumer注册,订阅类似于消息队列的注册 ...

  5. Entity Framework Code First学习系列目录

    Entity Framework Code First学习系列说明:开发环境为Visual Studio 2010 + Entity Framework 5.0+MS SQL Server 2012, ...

  6. WCF学习系列汇总

    最近在学习WCF,打算把一整个系列的文章都”写“出来,包括理论和实践,这里的“写”是翻译,是国外的大牛写好的,我只是搬运工外加翻译.翻译的不好,大家请指正,谢谢了.如果觉得不错的话,也可以给我点赞,这 ...

  7. EF(Entity Framework)系统学习系列

    好久没写博客了,继续开启霸屏模式,好了,废话不多说,这次准备重新系统学一下EF,一个偶然的机会找到了一个学习EF的网站(http://www.entityframeworktutorial.net/) ...

  8. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

  9. YYKit学习系列 ---- 开篇

    准备花半年时间系统学习YYKit,  学习过程会放入"YYKit学习系列"这个分类, 喜欢YYKit的可以随时留意我的文章, 一起学习!!!

随机推荐

  1. 纯手写Myatis框架

    1.接口层-和数据库交互的方式 MyBatis和数据库的交互有两种方式: 使用传统的MyBatis提供的API: 使用Mapper接口: 2.使用Mapper接口 MyBatis 将配置文件中的每一个 ...

  2. 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例

    java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...

  3. php中int类型在不同平台所占不同字节数理解

    1.在不同平台上占字节数与最大值 在32位平台上int占4个字节,在64位平台上int占8个字节,PHP_INT_SIZE 在32位平台上int的最大值2^31 - 1,在64位平台上int最大值2^ ...

  4. MATLAB矩阵基础运算

    1.矩阵的加减运算X+Y或者X-Y:元素对应相加减.在此要求X与Y必须是同维矩阵,否则会出现错误信息.如果Y为一个数,则表示X中每一元素+Y或者-Y: %当X和Y都为同维矩阵时 X=[1,2,-3;2 ...

  5. 15 THINGS ALL GIRLS SHOULD KNOW ABOUT THEIR VAGINA

    Here are 15 facts that EVERY GIRL should know about her vagina. Don’t be shy! Your vagina is part of ...

  6. HDU - 1686 Oulipo KMP匹配运用

    id=25191" target="_blank" style="color:blue; text-decoration:none">HDU - ...

  7. 测试整合之王Unitils

    16.4.1  Unitils概述(1) Unitils测试框架目的是让单元测试变得更加容易和可维护.Unitils构建在DbUnit与EasyMock项目之上并与JUnit和TestNG相结合.支持 ...

  8. poj 2479 Maximum sum(递推)

     题意:给定n个数,求两段连续不重叠子段的最大和. 思路非常easy.把原串划为两段.求两段的连续最大子串和之和,这里要先预处理一下,用lmax数组表示1到i的最大连续子串和,用rmax数组表示n ...

  9. IP、操作系统、移动OS

    IP IP地址 = 网络地址 + 主机地址/IP地址 = 网络地址 + 子网地址 + 主机地址. DNS :进行域名解析的服务器.             比如,sina.com(是域名).其实是一个 ...

  10. 在VS2013中打开Nuget

    1.工具→NuGet程序包管理器→程序包管理控制台 2.没有的话,就去  工具→扩展和更新   搜索nuget