很多学习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. 用js写水仙花数

    ...js   //输入一个三位数,水仙花数就是个位的三次方+十为的三次方+百位的三次方之和等于本身 console.log('请输入一个三位数:'); let a = readline.questi ...

  2. DML-删除

    方式一:使用delete一.删除单表的记录★语法:delete from 表名 [where 筛选条件][limit 条目数]二.级联删除[补充]语法:delete 别名1,别名2 from 表1 别 ...

  3. Oracle split分区表引起ORA-01502错误

    继上次删除分区表的分区遇到ORA-01502错误后[详细见链接:Oracle分区表删除分区引发错误ORA-01502: 索引或这类索引的分区处于不可用状态],最近在split分区的时候又遇到了这个问题 ...

  4. JavaScript高级程序设计(复制变量值、传递参数)

    复制变量值 一个变量向另一个变量复制基本类型值和引用类型值时,是存在不同的. 一个变量向另一个变量复制基本类型的值,会在变量的对象上创建一个新值,然后把该值复制到为新变量分配的位置上. var num ...

  5. android软件开发之获取本地音乐属性

    歌曲的名称 :MediaStore.Audio.Media.TITLString tilte = cursor.getString(cursor.getColumnIndexOrThrow(Media ...

  6. chromium之histogram.h

    histogram不知道是干啥的 // Histogram is an object that aggregates statistics, and can summarize them in // ...

  7. Jmeter的实例应用

    目标: 获取城市的天气数据: 第一步: 发送request 获取城市的城市代号http://toy1.weather.com.cn/search?cityname=上海 从这个请求的response ...

  8. shell习题第2题:统计ip访问量

    [题目要求] 有日志1.log,部分内容如下: 112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com “/seccode. ...

  9. linux ping命令实践

          ping 解析       Linux系统的ping命令是常用的网络命令,它通常用来检测与目标主机的连通性,经常说"ping以下机器,看是否开着,不能打开网页时候,可以ping ...

  10. centos6,python3,通过pip安装pycurl出现报错提示

    Centos6.7系统,python3.6.7,通过 pip 安装pycurl出现报错: __main__.ConfigurationError: Could not run curl-config: ...