您的位置:首页 > 其它

2. 快速入门-跟着例子走

2016-04-15 17:36 274 查看
是否可以成功运行这个例子,对于增加你的学习信心很重要。

当然,其中遇到的很多不明白的问题、配置和代码等,先放一放,不要着急。

你目前的任务就是实现这个例子,并成功运行它。

我这里采用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();


如果你在数据库中发现了这条数据,那么你成功了。

如果失败了,按照以上过程梳理一下,是不是落下了哪个环节;

当然,你也可以给我留言,或许是我遗忘了什么,如此,那对不住了;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: