很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了。

网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本号,

另外许多人抱怨配置比较麻烦,本教程结合FluentNHibernate简化配置,快速上手。

下载类库、版本要求:

NHibernate 3 及以上

Iesi.Collections 1.0.1.0

FluentNHibernate 1.4.0.0

.NET Framework 3及以上

NH3已经将日志与动态代理的类库集成了,所以只需要引入前两个配置文件。

总体思路:

1、通过配置文件hibernate.cfg.xml配置数据库连接;

2、配置文件注入到FluentNHibernate;

3、并添加实体模型的映射程序集到FluentNHibernate;

hibernate.cfg.xml:

数据库Oracle10g配置文件,看到那段被注释的英文了吗?

大致意思就是其他数据库可以参考NH包里面的数据库名称对应的配置文件,然后把文件名改成hibernate.cfg.xml,放在类库的根目录。

别忘了将配置文件复制到输出目录

<?xml version="1.0" encoding="utf-8"?>
<!--
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
for your own use before compile tests in VisualStudio.
-->
<!-- This is the System.Data.OracleClient.dll provider for Oracle from MS -->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="MyManager">
<property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
<property name="connection.connection_string">
User ID=user;Password=pwd;Data Source=oracle
</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
</session-factory> </hibernate-configuration>

顺手建立一个DBHelper类,或者叫SessionBuilder,直接复制一步到位。

    /*
* by:13yan
*/
public class SessionBuilder
{
private static ISessionFactory sessionFactory = null;
private static object _lock = new object(); #region 初始化 生成SessionFactory,并配置上下文策略
public static void Instance(string currentSessionContextClass)
{
lock (_lock)
{
Configuration cfg = new Configuration()
.Configure()
.SetProperty("current_session_context_class", "web");
sessionFactory= Fluently.Configure(cfg)
.Mappings(m =>
m.FluentMappings
.AddFromAssembly(typeof(SessionBuilder).Assembly))
.BuildSessionFactory();
}
}
#endregion #region Session在当前上下文的操作
private static void BindContext()
{
lock (_lock)
{
if (!CurrentSessionContext.HasBind(sessionFactory))
{
CurrentSessionContext.Bind(sessionFactory.OpenSession());
}
}
} private static void UnBindContext()
{
lock (_lock)
{
if (CurrentSessionContext.HasBind(sessionFactory))
{
CurrentSessionContext.Unbind(sessionFactory);
}
}
} public static void CloseCurrentSession()
{
UnBindContext();
} public static ISession GetCurrentSession()
{
BindContext();
return sessionFactory.GetCurrentSession();
}
#endregion #region 关闭SessionFactory(一般在应用程序结束时操作)
public static void CloseSessionFactory()
{
if (!sessionFactory.IsClosed)
{
sessionFactory.Close();
}
}
#endregion #region 打开一个新的Session
public static ISession OpenSession()
{
lock (_lock)
{
return sessionFactory.OpenSession();
}
}
#endregion }

使用这个类需要在应用程序启动时初始化,调用代码:SessionBuilder.Instance("web");,一般添加在Global.asax

    public class Global : System.Web.HttpApplication
{ void Application_Start(object sender, EventArgs e)
{
// 在应用程序启动时运行的代码
SessionBuilder.Instance("web");
} }

使用时可调用SessionBuilder.GetCurrentSession()获取上下文中的Session,以便实现自动打开关闭Session,

也可以SessionBuilder.OpenSession()得到一个普通的Session。

代码映射:

public class Department
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
} public class DepartmentMap:ClassMap<Department>
{
public DepartmentMap()
{
Table("SYSDEPT");
Id(p => p.ID).GeneratedBy.Sequence("SEQ_SYSDEPT");
Map(p => p.Name);
}
}

这个使用单实体的例子非常简单,相信差不多够上手了,

更加复杂的配置有一定的学习曲线,推荐边学边用,以前用低端一点的ORM不也单实体在用么,

NH的好处就在于简单起来可以很简单地用,完全上手后又拥有其他一般ORM无法满足的功能。

映射的重点:

实体类与数据库之间需要有一个映射,所以我们建立一个DepartmentMap映射类,它需要继承FluentNHibernate.Mapping.ClassMap<T>泛型类。

Table("SYSDEPT") 对应数据库表名;

Id映射主键,这里使用sequence,其他还有许多办法,比如GUID、自增长等。

Map映射,属性名与数据库字段相同就不需要另外声明了。

测试一下,看看我们是否成功了。

ISession session = SessionBuilder.GetCurrentSession();
session.BeginTransaction();
Department obj = session.Load<Department>();
obj.Name = "新部门";
session.SaveOrUpdate(obj);
session.Transaction.Commit();

如果到这里已经能够获取到session了,那么恭喜你成功了,现在我们已经可以边看官方文档边实战了。

如果你看不懂这段代码,没关系,可以边看官方文档边练习了。

NHibernate3快速上手教程FluentNHibernate配置与DBHelper的更多相关文章

  1. NHibernate3快速上手教程FluentNHibernate配置与DBHelper(已过期,有更好的)

    很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了. 网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本 ...

  2. 新浪SAE快速上手教程

     新浪SAE快速上手教程[1]如何免费开通新浪云 2014-07-18 > 新浪SAE快速上手教程[2]如何创建.删除应用 2014-07-24 > 新浪SAE快速上手教程[3]如何上传应 ...

  3. Airtest 快速上手教程

    一.Airtest 简介: AirtestIDE 是一个跨平台的UI自动化测试编辑器,适用于游戏和App. 自动化脚本录制.一键回放.报告查看,轻而易举实现自动化测试流程 支持基于图像识别的 Airt ...

  4. 面向Unity程序员的Android快速上手教程

    作者:Poan,腾讯移动客户端开发 工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 随着Unity.cocos2dx等优秀跨平台游戏引擎的出现,开发者可以把 ...

  5. 快速上手开发——JFinal配置(全步骤图文解析)

    摘要: 因为发现官网上只有Eclipse的配置文档,就写了这篇基于IDEA+maven的配置流程.本文使用安装了maven插件的IDEA进行配置,为了照顾IDEA新手,几乎每个步骤都截了图. 环境说明 ...

  6. 《Python操作SQLite3数据库》快速上手教程

    为什么使用SQLite数据库? 对于非常简单的应用而言,使用文件作为持久化存储通常就足够了,但是大多数复杂的数据驱动的应用需要全功能的关系型数据库.SQLite的目标则是介于两者之间的中小系统.它有以 ...

  7. Appscan 工具快速上手教程

      1.appscan扫描 (1)白盒扫描=静态扫描,扫描源代码.(2)动态扫描=黑盒扫描,用工具来模拟黑客的攻击,查看应用层的响应.产品内部会有大量受攻击的库,当我们把一个模拟攻击发给我们的应用的时 ...

  8. python快速上手教程

    python版本 python目前的版本分为2.7和3.5,两种版本的代码目前无法兼容,查看python版本号: python --version 基本数据类型 数字类型 整型和浮点型数据和其它编程语 ...

  9. gensim快速上手教程

    1 gensim是什么?        gensim是一个Python常用的的自然语言处理开发包, 主要用于词向量训练和加载词向量,以下解释其正确使用姿势. 2 正确使用姿势 from gensim. ...

随机推荐

  1. caffe的python接口学习(4):mnist实例---手写数字识别

    深度学习的第一个实例一般都是mnist,只要这个例子完全弄懂了,其它的就是举一反三的事了.由于篇幅原因,本文不具体介绍配置文件里面每个参数的具体函义,如果想弄明白的,请参看我以前的博文: 数据层及参数 ...

  2. JAVA集合介绍

    一.集合概述 Java是一种面向对象语言,如果我们要针对多个对象进行操作,就必须对多个对象进行存储.而数组长度固定,不能满足变化的要求.所以,java提供了集合. 特点 1.        长度可以发 ...

  3. URLConnection类介绍

    URLConnection是一个功能强大的抽象类,它表示指向URL指定资源的活动连接. 与URL类相比,它与服务器的交互提供了更多的控制机制.尤其服务器是HTTP服务器,可以使用URLConnecti ...

  4. Ubuntu 安裝 嘸蝦米 輸入法

    O S : 14.04.1-Ubuntu 加入fcitx開發團隊的repository: sudo add-apt-repository ppa:fcitx-team/nightly sudo apt ...

  5. WinNTSetup v3.8.7 正式版绿色增强版

    最强系统安装利器:WinNTSetup 现已更新至 v3.8.7 正式版!这次更新修复调整了诸多问题,新版非常好用接近完美!WinNTSetup 现在已经自带BCDBoot 选项,并且完全支持Wind ...

  6. Python 面向对象 中高级

    类成员: #字段 普通字段 属于对象 执行只能通过对象访问 静态字段 属于类 执行 既可以通过对象访问,也可以通过类访问 class Foo: def __init__(self,name): # 字 ...

  7. Java初学者笔记

    Java初学者笔记 前提:认识汉字,认识英语单词,会用键盘打字 ------------------------------- 端口是什么: --------面向对象编程(OOP) 接口”(Inter ...

  8. Google Map API V3开发(4)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  9. [Unity3d]3D项目转换为VR项目(暴风魔镜SDK)

    使用暴风魔镜SDK来操作 将魔镜的摄像头拖放到项目中: 将MoJingVrHead的Script剪切到CamRoot中: 这个时候能看到显示2个物体了,不过使用的Canvas还是显示一个: 调整Can ...

  10. WinPcap4.13无法安装解决方法

    360软件管家提示把WinPcap更新至版本:4.1.0.2980,于是把旧版下载后,可新版本怎么也无法顺利安装,出现以下信息,旧版本已安装,关闭所有winpcap-based应用程序和再次运行安装程 ...