标签:
是否可以成功运行这个例子,对于增加你的学习信心很重要。
当然,其中遇到的很多不明白的问题、配置和代码等,先放一放,不要着急。
你目前的任务就是实现这个例子,并成功运行它。
我这里采用Web项目(你也可以采用WinForm 或 控制台程序):
1. 新建两个项目:
因为我们写的是Demo,所以并没有严格按照一种框架去搭建项目,只是简单的用了两个项目(之后还会添加一个Models类库项目),这样可以尽可能排除框架对你的干扰,让你把更多的精力花在学习NHibernate上面。
NHibernateWeb 和 NHibernateHelper,其中:
--- NHibernateWeb 是Web项目,你可以采用你熟悉的任何框架,如webform 或 mvc都可以;
--- NHibernateHelper 是编写NHibernate相关代码的类库项目
2. 添加需要的dll
我采用的是NuGet添加NHibernate,你也可以到官网下载:NHibernate,下载之后解压即可,目录结构如下表:
目录结构 | 说明 |
Configuration_Templates | 项目相关配置模板文件,如连接数据库、方言等 |
Required_Bins |
主要的几个dll: Iesi.Collections:NHibernate中泛型列表List在这个dll里面 NHibernate.dll:主要的dll,肯定需要引用了 另外两个.xsd文件,是帮助你在vs下编写xml配置文件的,你需要把这两个文件复制到Vs安装目录\Xml\Schemas下,就可以了 |
接下来你需要添加引用:
首先把NHibernate.dll添加到这两个项目的引用(如果你和我一样,采用NuGet添加引用,那么可以省略这一步),然后把Configuration_Templates目录下的MySql.hbm.xml文件拷贝到NHibernateWeb 项目的根目录下,并执行以下两步操作:
a. 重命名为hibernate.hbm.xml
(因为在调用NHibernate时,我们将采用默认的加载机制,而NHibernate默认加载的文件名就是bin下的hibernate.hbm.xml文件)
b. 右键该文件并选择属性,将“复制到输出目录”选择为“始终复制”
(这样每次修改该文件后,不用手动复制的到bin目录下,否则NHibernate读取的始终是旧版本的配置文件)
现在,让我们再添加一个类库项目(之所以配置完之后再添加,是因为这个类库项目没有那么多的配置,比较简单。
添加一个类库项目:Models,该类库项目用于添加实体类和映射文件(很快你就知道是什么了,不用着急,比较简单)。
到目前你已经搭建好了整个项目结构,接下来要做的就是各种配置和编写相关的代码:
1. 首先配置项目配置文件hibernate.hbm.xml
该文件的配置项很多,庆幸的是系统已经给出了比较合理的默认配置,所以目前我们只修改几处必须的配置:
a. connection.connection_string : 数据库配置串,这个你应该很熟悉了吧,不多说
b. 给标签<session-factory>添加最后一个子元素:<mapping assembly="Models" />
-- 这个Models就是我们最后新建的这个类库项目的程序集
<?xml version="1.0" encoding="utf-8"?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > <session-factory name="NHibernate.Test"> <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property> <property name="dialect">NHibernate.Dialect.MySQLDialect</property> <property name="connection.connection_string"> Database=donny;Data Source=127.0.0.1;User Id=root;Password=123456;Charset=utf8; </property> <mapping assembly="FrameTester"/> </session-factory> </hibernate-configuration>
注: 其实该配置文件有很多方式可以配置,比如放在web.config中或者其他目录里面或者采用其他的名字等,为了能快速搭建起来,我们还是采用默认的这种方式,其他的之后我们会详细介绍。
2. 编写实体类和映射文件
实体类对应着数据库中的一个表,但是实体类的属性对应着数据表中的哪个列呢?这个由映射文件类指定。
a. 实体类
namespace Models { public class User { public virtual int ID { get; set; } public virtual string Name { get; set; } public virtual int Role { get; set; } public virtual string Password { get; set; } public virtual string Descript { get; set; } } }
注意:实体类的属性必须是虚拟的(virtual),那是因为NHibernate内部实现要求的,目前记住就可以了。
b. 映射文件
有两点必须注意:
** 映射文件的名称必须是 实体类名.hbm.xml
** 映射文件必须是 嵌入资源
(嵌入资源的设置方法:右键文件-属性,选择“生成操作”为“嵌入的资源”)
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="FrameTester.Models" assembly="FrameTester"> <class name="FrameTester.Models.User,FrameTester" table="user"> <id name="ID"> <column name="id" sql-type="int" not-null="true"/> <generator class="assigned"></generator> </id> <property name="Name"/> <property name="Role"/> <property name="Password"/> <property name="Descript"/> </class> </hibernate-mapping>
该文件肯定会让你觉得头疼,之后我们会详细的介绍,所以不用担心。
但是细心的你,可能注意到在<hibernate-mapping>节点的属性中,有namespace和assembly属性,另外在<class>配置节的name属性中,也同样指定了命名空间和程序集,我是故意这么做的,有意告诉你这两个位置都可以指定,现实中,选择一种方式就可以了。
3. 编写核心代码 -- 暂且这么说吧
在NHibernateHelper项目中添加一个class,如下:
public sealed class NHibernateHelper { private static readonly NHibernateHelper _helper = new NHibernateHelper(); private NHibernateHelper() { this.Init(); } public static NHibernateHelper Helper { get { return _helper; } } private ISessionFactory _sessionFactory = null; private void Init() { Configuration cfg = new Configuration().Configure(); this._sessionFactory = cfg.BuildSessionFactory(); } public ISession GetSession() { return this._sessionFactory.OpenSession(); } }
OK,你还有一步就成功了。
4. 添加引用并编写测试代码
把 NHibernateHelper和Models 添加到 NHibernateWeb 的引用中。
然后新建一个Controller(我采用的是MVC4框架,你也可以添加一个index.aspx):
a. MVC
在Controller添加一个ActionResult函数Index()添加以下代码:
b. WebForm
在index.aspx.cs的page_load()中添加以下代码:
ISession session = NHibernateHelper.Helper.GetSession(); session.Save(new Models.User() { ID = 2, Name = "Donny", Descript = "测试", Password = "123", Role = 1 }); session.Flush();
如果你在数据库中发现了这条数据,那么你成功了。
如果失败了,按照以上过程梳理一下,是不是落下了哪个环节;
当然,你也可以给我留言,或许是我遗忘了什么,如此,那对不住了;
标签:
原文地址:http://www.cnblogs.com/wangdy/p/5396247.html