转载地址http://www.cnblogs.com/kissdodog/p/3306428.html

 使用NHibernate最重要的一步就是配置,如果连NHibernate都还没有跑的起来,谈何学习。今天就来详解一下NHibernate的配置。

一、NHibernate基本配置

  NHibernate配置要注意的有:

  1、NHibernate需要一个自定义的配置节点,一般放在Web.config里或App.config里面,当然你可以自己定义实际位置。

  示例如下:

  

<configSections>
    <section name="hibernate-configuration"
        type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"
        />
  </configSections>
  <!-- Add this element -->
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
      <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.connection_string">
        Data Source=.;Initial Catalog=Zhijiao;Integrated Security=True
      </property>
      <mapping assembly="zhijiao" />
    </session-factory>
  </hibernate-configuration>

实体类

namespace zhijiao
{
    public class NewsPub
    {

        /// <summary>
        /// ID
        /// </summary>
        public virtual int ID
        {
            get;
            set;
        }
        /// <summary>
        /// NTitle
        /// </summary>
        public virtual string NTitle
        {
            get;
            set;
        }
        /// <summary>
        /// NContent
        /// </summary>
        public virtual string NContent
        {
            get;
            set;
        }
        /// <summary>
        /// NDate
        /// </summary>
        public virtual string NDate
        {
            get;
            set;
        }
        /// <summary>
        /// NHits
        /// </summary>
        public virtual int NHits
        {
            get;
            set;
        }
        /// <summary>
        /// NType
        /// </summary>
        public virtual int NType
        {
            get;
            set;
        }
        /// <summary>
        /// NPic
        /// </summary>
        public virtual string NPic
        {
            get;
            set;
        }

    }
}

实体类XML

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
    namespace="zhijiao" assembly="zhijiao">

  <class name="zhijiao.NewsPub,zhijiao" table="NewsPub">

    <!-- A 32 hex character is our surrogate key. It's automatically
            generated by NHibernate with the UUID pattern. -->
    <id name="ID" type="Int32">
      <column name="ID"   not-null="true"/>
      <generator class="identity" />
    </id>

    <!-- A cat has to have a name, but it shouldn' be too long. -->
    <property name="NTitle" type="string">
      <column name="NTitle"  length="50" not-null="true" />
    </property>
    <property name="NContent" type="string">
      <column name="NContent"   not-null="true" />
    </property>
    <property name="NDate" type="StringClob">
      <column name="NDate" length="2147483647"   not-null="true" />
    </property>
    <property name="NHits" type="Int32">
      <column name="NHits"   not-null="true" />
    </property>
    <property name="NType" type="Int32">
      <column name="NType"   not-null="true" />
    </property>
    <property name="NPic" type="string">
      <column name="NPic" length="50"   not-null="true" />
    </property>
  </class>

</hibernate-mapping>

加载Nhibernate

 private static readonly ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();

sessionFactory.OpenSession();

  另外,这一个配置节点文件,并不一定要放在Web.config或App.config里,例如你可以定义一个hibernate.cfg.xml文件,然后创建ISessionFactory时指定位置:

ISessionFactory sessionFactory = new Configuration().Configure(AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "hibernate.cfg.xml").BuildSessionFactory();

  这里要小心"new Configuration().Configure()",如果没有Configure("xxx.cfg.xml")就是从配置文件加载,有就是从自定义文件(如:xxx.cfg.xml)加载。

  注意,此hibernate.cfg.xml文件名可以随意起,但是要设置为始终复制。否则将报告如下错误:

  An exception occurred during configuration of persistence layer.

  2、NHibernate的映射文件一定要设为嵌入的资源。

  

  3、NHibernate的实体类所有的属性都要加上virtual-虚属性,具体将在持久化类的文章中说明,下面给个例子:

    public class PersonModel
{
public virtual int Id { get; set; } public virtual string Name { get; set; }
}

  NHibernate作为一个ORM框架,它需要知道如何将数据库的表与对应的实体类相关联,NHibernate通过映射文件的方式来获得这方面的信息。

二、获取映射文件相关配置

  NHibernate中的映射文件以hbm.xml为后缀结束,NHibernate获取映射文件的方法有3种方法。

  1、从config程序配置文件获取映射文件位置

  NHibernate运行在.Net程序上,需要自己提供一个自定义配置节点,这个配置节点里面包含了数据库连接,什么数据库等等信息。其中就包括了配置文件所在位置的信息。

  NHibernate会直接从Web.config或App.config文件上的配置节点上读取这个节点,然后从节点指定的程序集去查找映射文件。

  <mapping assembly ="Nx.Repository"/>  

  以上这个配置节点所保存的就是映射文件默认所在的程序集。这样当程序启动时,NHibernate就会自动去Nx.Repository寻找*.hbm.xml映射文件。

  如果NHibernate找不到映射文件,则可能会报如下错误:

“/”应用程序中的服务器错误。


No persister for: xxx.xxx

  2、编程的方式,写在代码里

  (1)、AddFile 指定映射文件

  ISessionFactory sessionFactory = new Configuration().Configure().AddFile(@"C:\Users\Administrator\Desktop\NHibernate学习\Model\Mapping\Person.hbm.xml").BuildSessionFactory();

  注意,当你不写全路径的时候,也就是只写个文件名,那么NHibernate就会从配置文件读取程序集,到配置文件中指定的程序集去加载此映射文件。如果配置文件并不指定程序集,那么就从当前程序集中查找指定名的映射文件。但这种方式,不必设置嵌入的资源,但要记得设置为始终复制。

  Configuration cfg = new Configuration().AddFile("Mapping/Person.hbm.xml");
ISessionFactory sessionFactory = cfg.BuildSessionFactory();

  这种方法只是指定一个文件,但是可以链式指定多个如:AddFile("f1").AddFile("f2")。

  (2)、AddAssembly

  还有另外一种方法,在创建Configuration时指定程序集。

  Configuration cfg = new Configuration().AddAssembly("Model");       //Model为映射文件所在程序集名称
ISessionFactory sessionFactory = cfg.BuildSessionFactory();

  这种方法,即使.config配置文件里<mapping assembly=""/>节点为空也没关系,NHibernate会自动到指定的程序集里查找所有以.hbm.xml结尾的文件。

  (3)、AddClass

  这种方式,可以消除程序对文件路径字符串的硬编码。

  Configuration cfg = new Configuration().AddClass(typeof(Model.Person));
ISessionFactory sessionFactory = cfg.BuildSessionFactory();

  但是缺点也非常明显,类名必须与映射文件的名称相同。不然,编译就无法通过,因为Person类都找不到。另外,映射文件Person.hbm.xml必须放在根目录。

  NHibernate会自动到程序中去查找名为Person.hbm.xml文件。

Nhibernate初入门基本配置(二)的更多相关文章

  1. NHibernate初入门之配置文件属性说明(四)

    一.NHibernate配置所支持的属性 属性名 用途 dialect 设置NHibernate的Dialect类名 - 允许NHibernate针对特定的关系数据库生成优化的SQL 可用值: ful ...

  2. Nhibernate初入门基本配置(一)

    文章出处:http://www.cnblogs.com/GoodHelper/archive/2011/02/14/nhiberante_01.html 一.NHibernate简介 什么是?NHib ...

  3. NHibernate初入门之映射文件配置说明(三)

    转载逆心http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 1. hibernate-mapping 这个元素包括以下可选 ...

  4. Flume初入门简单配置与使用

    1.Flume在集群中扮演的角色 Flume.Kafka用来实时进行数据收集,Spark.Storm用来实时处理数据,impala用来实时查询. 2.Flume框架简介 1.1 Flume提供一个分布 ...

  5. Kafka初入门简单配置与使用

    一 Kafka概述 1.1 Kafka是什么 在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算. 1)Apache Kafka是一个开源消息系统,由Scala写成. ...

  6. ROS入门笔记(二):ROS安装与环境配置及卸载(重点)

    ROS入门笔记(二):ROS安装与环境配置及卸载(重点) [TOC] 1 ROS安装步骤 1.1 ROS版本 ROS目前只支持在Linux系统上安装部署, 它的首选开发平台是Ubuntu. 发布时间 ...

  7. NHibernate从入门到精通系列

    http://www.cnblogs.com/GoodHelper/archive/2011/02/17/1948744.html NHibernate从入门到精通系列(4)——持久对象的生命周期(上 ...

  8. WCF入门教程(二)如何创建WCF服务

    WCF入门教程(二)从零做起-创建WCF服务 通过最基本的操作看到最简单的WCF如何实现的.这是VS的SDK默认创建的样本 1.创建WCF服务库 2.看其生成结构 1)IService1.cs(协议) ...

  9. 分布式消息系统Jafka入门指南之二

    分布式消息系统Jafka入门指南之二 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 三.Jafka的文件夹结构 1.安装tree命令 $ sudo yu ...

随机推荐

  1. [原创]obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用

    原文链接:obj-c编程15[Cocoa实例02]:KVC和KVO的实际运用 我们在第16和第17篇中分别介绍了obj-c的KVC与KVO特性,当时举的例子比较fun,太抽象,貌似和实际不沾边哦.那么 ...

  2. 从源码看Android中sqlite是怎么通过cursorwindow读DB的

    更多内容在这里查看 https://ahangchen.gitbooks.io/windy-afternoon/content/ 执行query 执行SQLiteDatabase类中query系列函数 ...

  3. nautilus-open-terminal右键随处打开终端

    Nautilus-Open-Terminal : 可随处打开终端的 Nautilus 插件 nautilus-open-terminal-0.17-4.el6.x86_64 是一个让你随处都可以打开终 ...

  4. Hat's Fibonacci(大数,好)

    Hat's Fibonacci Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. SPDY HTTP2.0

    SPDY(读作“SPeeDY”)是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验.SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强 ...

  6. 关于HTTP 协议的特点,以及网络请求GET 和 POST 的区别?

    HTTP协议有何特点: HTTP 超文本的传输协议,是短连接,是客户端主动发送请求,服务器做出响应,服务器响应之后连接断开 HTTP是属于应用层面向对象的协议,HTTP 有2类报文:请求报文和响应报文 ...

  7. Java程序在向mysql中插入数据的时候出现乱码

    今天在往数据库中插入数据的时候中文字符在数据库中就出现了乱码?网上有各种说法,但是适合我的,最终解决我的问题的只有下面一种! 在创建数据库的时候,注意设置编码方式. CREATE DATABASE ` ...

  8. English - 英文写作中的最常见“十大句式”

    英文写作中的最常见“十大句式” from 小木虫论坛 一.否定句 许多否定句不含not的否定结构.如果论文作者能正确使用他们,就会增加写作的闪光点,使文章显得生动活泼. 1.Instead of in ...

  9. CLLocation

    http://blog.sina.com.cn/s/blog_9e8867eb01013knc.html 这家伙写的不错本人也参考了这篇博客,希望原文博主可以谅解新手的无奈举措 首相要提到的类是 CL ...

  10. 原生js封装table表格操作,获取任意行列td,任意单行单列方法

    V1.001更新增加findTable-min.js 本次更新,优化了代码性能方面,增加了部分新功能,可以获取多个table表格批量操作. 考虑到本人后面的项目中可能涉及到大量的表格操作,提前先封了 ...