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

运行后的结果:

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

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

MVC中使用Nhibernate,布布扣,bubuko.com

时间: 2024-11-05 06:24:35

MVC中使用Nhibernate的相关文章

NHibernate中Session与ASP.NET MVC中Action的综合使用

NHibernate的基本特征是完成面向对象的程序设计语言到关系数据库的映射,在NHibernate中使用持久化对象PO(Persistent Object)完成持久化操作,对PO的操作必须在Session管理下才能同步到数据库, 但是这里的Session并非指HttpSession,可以理解为基于ADO.NET的Connnection,Session是NHibernate运作的中心,对象的生命周期.事务的管理.数据库的存取都与Session息息相关,首先,我们需要知道, SessionFact

[转]ASP.NET MVC Spring.NET NHibernate 整合

请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需要对 ASP.NET,Spring.NET,NHibernate有所了解,最好是有一些经验,因为平白无故的就把3个技术融合到一起,会闹些小别扭,其实就像配置化学药品一样,如果3中原料有一点出路,那么整个实验也就失败了. 在网上有很多高人都写过类似的文章,可能是鄙人不才,看了很多文章都没有把我的问题解

ASP.NET MVC+Spring.net+Nhibernate

第八步:Asp.NET MVC引入的DLL文件 (1) 通过上面的准备工作,可以说是我们的大部分基层代码的书写任务都已经完成了,下面才是本项目值得学习的地方,我们全部在MVC新建的项目中书写代码,因为这里用到了Spring.net,Nhibernate,MVC,easyUI等,所以非常值得我们去研究,当然我的写法可能也有问题,希望我们可以交流,这样我们可以共同进步. (2) 因为用到了Nhibernate,Spring.net,所以我将引入的DLL文件的截图先放在这里吧,当然,我的项目中有dll

ASP.NET MVC中为DropDownListFor设置选中项的方法

在MVC中,当涉及到强类型编辑页,如果有select元素,需要根据当前Model的某个属性值,让Select的某项选中.本篇只整理思路,不涉及完整代码. □ 思路 往前台视图传的类型是List<SelectListItem>,把SelectListItem选中项的Selected属性设置为true,再把该类型对象实例放到ViewBag,ViewData或Model中传递给前台视图. 通过遍历List<SelectListItem>类型对象实例 □ 控制器 ? 1 2 3 4 5 6

MVC中处理Json和JS中处理Json对象

事实上,MVC中已经很好的封装了Json,让我们很方便的进行操作,而不像JS中那么复杂了. MVC中: public JsonResult Test() { JsonResult json = new JsonResult { Data = new { Name = "zzl", Sex = "male", } }; return Json(json); }   public JsonResult TestList() { List<User> user

log4net 使用总结- (2)在ASP.NET MVC 中使用

log4net在ASP.NET MVC中的配置,还有一种配置方式,即不在web.config中,而是单独新建一个log4net.config 在根目录下 第一.引用log4net.dll 第二.在站点根目录下增加log4net.config <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="

MVC中实现加载更多

需要实现的功能: 数据太多想初次加载部分数据,在底部加上"加载更多"按钮 点击后加载第二页数据(从数据库只取指定页数据)后接在已有数据后面(类似于android中的下拉加载更多) 每次加载时显示"正在加载--" 网上找了一些方法,类似于MvcPager分页组件,用的是v1.5.0版,但后台需要将分页后的对象列表ToPagedList,需要在MvcPager源码中加入public static PagedList<T> ToPagedList<T&g

使用Json.Net解决MVC中各种json操作

最近收集了几篇文章,用于替换MVC中各种json操作,微软mvc当然用自家的序列化,速度慢不说,还容易出问题,自定义性也太差,比如得特意解决循环引用的问题,比如datetime的序列化格式,比如性能.NewtonSoft.json也就是Json.Net性能虽然不是最好的,但是是比较靠前的,其功能是最强大的,包含各种json操作模式.现在来看看mvc中的替换1, Controller.Json方法这个方法最容易出现循环引用,比如EF查出一个一对多集合想序列化,结果a引用了子表b,b中还引用了a,导

Aspose.word在asp.net mvc中如何使用的个人总结

项目需要导出数据到word中,因为要导出的是表格形式,所以先在word中绘制好了表格,然后按照以前的代码改了改,发现不行.出现的问题如下: 这是当时的代码,问题的症结所在就是Response上.这段代码以前是写在asp.NET中的.在asp.net中,Response使用的是HttpResponse,但是该项目为Mvc架构,Mvc中为HttpResponseBase,二者不能兼容,不能强制转换.问题一直无法得到解决. 所以就改变了代码:如下. public ActionResult WordEx