zoukankan      html  css  js  c++  java
  • MVC之使用Nhibernate

    NHibernate是一个基于.Net,用于关系数据库的对象持久化类库.它是著名的Hibernate的.Net版本,NHibernate用于把你的.Net对象持久化到底层的关系数据库中.你完全不用自己编写Sql语句去操作这些对象,NH会代替你做.你的代码里面只需要关心这些对象,NH生成sql语句并能为你取到正确的东西。使用NHibernate的时候可以用任何数据库,只是在配置Nhiternte的时候配置成相应的数据库驱动就可以了。

    一、准备工作:

    1、在数据库中创建把.Net类持久化的对应表.
    2、创建需要被持久化的.Net类.
    3、创建映射文件,以告诉NH怎样持久化这些类的属性.
    4、创建NH的配置文件,以告诉NH怎样连接数据库.

    步骤1:创建数据库表
    在此实例中我使用的是MySql数据库,建的数据库名字为CMS,表名为Member;建表语句:

    create table member
    (
    Id int auto_increment primary key,
    Account varchar(50) not null comment '账户',
    `Password` varchar(100) not null comment '密码',
    `Type` int default 0 not null comment '类型;0,普通会员',
    `Source` int default 0 not null comment '来源;0,普通注册;1其他注册',
    Freezed int default 0 not null comment '状态;0,正常;1,禁用',
    `DateTime` datetime not null comment '注册时间'
    )comment '网站会员';

    步骤2:创建.Net类:

    NH是通过reflection对象的属性来工作的,所以我们给需要持久化的对象添加属性.一个对应于上面数据库结构的类可以写成这个样子:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CMS.Data.DomainModels
    {
        public class Member
        {
            public virtual int Id { get; set; }public virtual string Account { get; set; }
            public virtual string Password { get; set; }
            public virtual int Type { get; set; }
            public virtual int Source { get; set; }
            public virtual int Freezed { get; set; }
            public virtual DateTime DateTime { get; set; }
        }
    }

    步骤3:编写映射文件(Mapping File)
    现在我们有了数据库表和.Net类,我们还需要告诉NH怎样在数据库和类之间映射.这就需要映射文件了.最简捷(也是可维护性最好的)方法就是为每一个类编写一个映射文件,如果你把命名为"XXX.hbm.xml"的映射文件和XXX类文件放在同一目录下,NH会很让 一切变得很轻松.这儿,我们的Member.hbm.xml可能会像这样:

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
      <class name="CMS.Data.DomainModels.Member, CMS.Data" table="Member">
        <id name="Id" column="id">
          <generator class="native"/>
        </id>
        <property name ="Account" column="Account"/>
        <property name ="Password" column="Password"/>
        <property name ="Type" column="Type"/>
        <property name ="Source" column="Source"/>
        <property name ="Freezed" column="Freezed"/>
        <property name ="DateTime" column="DateTime"/>
      </class>
    </hibernate-mapping>

    下面解释一下这个映射文件:

    第一个tag是class,这里我们把类型名(类名和Assembly名)映射到数据库中的member表(这里和hibernate有些不同,我们必须告诉NH这个类从哪儿来的.这个差异是由.Net和Java Reflect机制的不同引起的).这种情况下,我们是从CMS.Data.DomainModels中载入CMS.Data.DomainModels.Member类.NH遵守.Net Framework使用Reflection载入类型的规则-所以遇到什么疑惑,就去查查.NET Framework SDK. 让我们暂时跳过"id" tag,先说property节点."name"属性值就是我们写的.Net类中的属性,column属性值就是在数据库中与'Net类属性对应的字段名.type属性是可选的(如果你没有标明,NH会给出一个最适合的),但是推荐的做法是带上这个属性.hibernate用户会注意到,在type属性值里,我们给出了长度值,这是因为ADO.NET需要这样做.让我们返回到"id" tag,你可能会猜想这个tag和映射到表的Primary Key有关.正确.ID  tag的格式和Property tag的相似.我们从Property(name)映射到目标数据库的字段(colume).这些嵌入的Generator标记告诉NH怎样生成Primary Key(NH很方便的就能给你生成一个,不管是什么类型的,只要你告诉它怎样去做).

    注意:在完成映射文件后,要将该映射文件右键->属性->生成操作的方式改为嵌入的资源,如图:

    步骤4:创建数据库配置文件
    目前为止,我们还没有告诉NH到哪儿去找数据库.最直接的方法就是在你程序的配置文件中给NH一个部分,就是这样:

       <!-- Nhibernate配置开始 -->
      <configSections>
        <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>
      </configSections>
     <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
        <session-factory name="NHibernateSession">
          <property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
          <property name="connection.connection_string_name">ConnectionString</property>
          <property name="show_sql">true</property>
          <property name="dialect">NHibernate.Dialect.MySQLDialect</property>
          <property name="cache.use_second_level_cache">false</property>
          <property name="cache.provider_class">NHibernate.Cache.HashtableCacheProvider</property>
          <property name="generate_statistics">true</property>
          <property name="cache.default_expiration">300</property>
          <property name="cache.region_prefix">CMS</property>
          <mapping assembly="CMS.Data"/>
        </session-factory>
      </hibernate-configuration>
      <!-- Nhibernate配置结束 -->

    上面的例子中使用MySql驱动,连接到本地的数据库链接名称为ConnectionString的数据库上,映射的文件在CMS.Data文件夹下。

    以上四个步骤做完后你将会有如下的成果文件:

    1、一个叫做member的数据库表.

    2、Member.cs - 需要持久化的.Net类.

    3、Member.hbm.xml - 映射文件.

    4、web.config - 带有NHibernate连接信息的配置信息(你也可以在代码中指定的)

    二、开始体验NHibernate:

    在代码里面使用NHibernate是很简单的事情,需要以下步骤:
    1、创建一个SessionFactory 对象.

    2、创建一个Session连接到设定的数据库.

    3、下面你就可以进行查询保存操作了

    步骤一、创建一个SessionFactory 对象
    在你新建的MVC网站中的某一个Controller里创建SessionFactory的时候,注意要引入下面两个引用:

    using NHibernate;
    using NHibernate.Cfg;

    创建语句如下:

    ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();

    步骤二、创建一个Session对象
    ISession对象代表着一个到后端数据库连接,ITransaction代表一个NHibernate管理的事务(Transaction).

    ISession session = sessionFactory.OpenSession();
    ITransaction transaction = session.BeginTransaction();

    步骤三、各种操作的应用,现在你可以以.net的方式对待这些对象

    如果想在数据库中保存一个新的Member只需要

    if (session != null)
                {
                    var model = new CMS.Data.DomainModels.Member();
                    model.Account = "cms";
                    model.Password = "123456";
                    model.Type = 0;
                    model.Source = 0;
                    model.Freezed = 0;
                    model.DateTime = System.DateTime.Now;
    
                    session.Save(model);
                    transaction.Commit();
                    session.Close();
                }

    整体的Controller代码如下:

    public ActionResult Index()
            {
                ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();
                ISession session = sessionFactory.OpenSession();
                ITransaction transaction = session.BeginTransaction();
                if (session != null)
                {
                    var model = new CMS.Data.DomainModels.Member();
                    model.Account = "cms";
                    model.Password = "123456";
                    model.Type = 0;
                    model.Source = 0;
                    model.Freezed = 0;
                    model.DateTime = System.DateTime.Now;
                    session.Save(model);
                    transaction.Commit();
                    session.Close();
                }
                return Content("注册成功");
            }

    运行后的结果:

    此时在数据库面会看到刚注册的该条数据:

    在运行的时候可能会出现各种错误信息,一般的错误信息直接在网上搜都可以找到解决方案的

  • 相关阅读:
    VScode 修改中文字体
    missing KW_END at ')' near '<EOF>'
    SQL inner join, join, left join, right join, full outer join
    SQL字符替换函数translater, replace
    SQL COOKBOOK SQL经典实例代码 笔记第一章代码
    sqlcook sql经典实例 emp dept 创建语句
    dateutil 2.5.0 is the minimum required version python
    安装postgresql后找不到服务 postgresql service
    Postgres psql: 致命错误: 角色 "postgres" 不存在
    【西北师大-2108Java】第十六次作业成绩汇总
  • 原文地址:https://www.cnblogs.com/cocoon/p/4997015.html
Copyright © 2011-2022 走看看