• 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("注册成功");
            }

    运行后的结果:

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

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

  • 相关阅读:
    PWA渐进式增强WEB应用
    如何去掉wordpress头部<link rel='next' href='*/page/2' />
    wordpress修改邮箱提示There is a pending change of your email to
    使用WP-China-Yes让你的wordpress告别429错误
    Focus
    α_β_γ_δ_ε_ζ_η_θ_ι_κ_λ_μ_ν怎么读
    Ubuntu总结常用命令记录
    声明
    你所不知道的冰冷的经济真相(转自来自天涯大佬)
    杨振宁演讲谈这件事:我很高兴中国政府没有上当
  • 原文地址:https://www.cnblogs.com/cocoon/p/4997015.html
Copyright © 2020-2023  润新知