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的更多相关文章
- [转]ASP.NET MVC Spring.NET NHibernate 整合
请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...
- ASP.NET MVC Spring.NET NHibernate 整合
请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...
- MVC+Spring.NET+NHibernate .NET SSH框架整合 C# 委托异步 和 async /await 两种实现的异步 如何消除点击按钮时周围出现的白线? Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法
MVC+Spring.NET+NHibernate .NET SSH框架整合 在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MV ...
- MVC+Spring.NET+NHibernate .NET SSH框架整合
在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MVC框架以后太灵活了(相比之前的web Form),嗯,关于.NET中的MVC框架我 ...
- 在MVC中使用NHibernate学习记录
NHibernate简介: NHibernate是一个面向.net环境的对象/关系数据库映射工具,对象/关系数据库映射(object/relational mapping,ORM)是一种技术,可以将对 ...
- ASP.NET MVC+WCF+NHibernate+Autofac 框架组合(一)
学习了Spring.NET+NHibernate的框架,觉得Spring.NET框架不够轻量,配置来配置去的比较头疼,所以把Spring.NET换成了Autofac框架,同时加入WCF框架整了一个组合 ...
- Spring.Net+Nhibernate
Spring.net+Nhibernate系列优秀文章导航 冬哥的Spring.Net+Nhibernate Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 NH ...
- ASP.NET MVC3 中整合 NHibernate3.3、Spring.NET2.0 时 Session 关闭问题
一.问题描述 在向ASP.NET MVC中整合NHibernate.Spring.NET后,如下管理员与角色关系: 类public class Admin { public virtual strin ...
- IT男的”幸福”生活
IT男的”幸福”生活 IT男的”幸福”生活"续1 IT男的”幸福”生活"续2 IT男的”幸福”生活"续3 IT男的”幸福”生活"续4 IT男的”幸福”生活 ...
随机推荐
- 树莓派zero_w 串口的使用(解决usb可用rxtx不可用的问题)
2018-06-0212:10:14 查了很多资料,搞了一上午,终于解决了,之前看教程做了树莓派与arduino的通信,GPIO的RXTX测试失败,无奈只能用USB,效果还可以,可是今天我想用RXTX ...
- windows多线程应用编程注意事项
1,资源争用保护 对于文件操作.界面资源.GDI操作等一般由主线程完成的任务,要加以顺序化处理(serialization),即一个资源一次只能由一个线程访问,多个线程同时访问将导致错误. 方法一般可 ...
- Server 2008 R2 事件查看器实现日志分析
在 windows server 2008 R2 中,可以通过点击 "开始" -> "管理工具" -> "事件查看器" ,来打开 ...
- error C2143: syntax error : missing ';' before '}'
今天弄Tab控件,干了一件非常愚蠢的事,没有去声明头文件.这也是今天要记录的问题,提示如下各种 前面一个符号是错误的.如果初学者遇到,算作一个提示,记得声明新类的.h 头文件 标签空间再进一步.cpp ...
- Java学习2_一些基础2_字符串_16.5.5
接上一次的博客. 不可变字符串: Java中String类没有提供用于修改字符串的方法.如果想将greeting中的“Hello”改为“Help!”需要先提取所需要的的字符,然后再拼接.即 greet ...
- mysql 转载
一.MySQL概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL ...
- Executors工厂类
newCachedThreadPool 重用之前的线程 适合执行许多短期异步任务的程序. 调用 execute() 将重用以前构造的线程 如果没有可用的线程,则创建一个新线程并添加到池中 默认为60s ...
- 转自王垠Blog——写给清华大学的退学申请
清华梦的粉碎—写给清华大学的退学申请(转自王垠Blog) 清华梦的诞生 小时候,妈妈给我一个梦.她指着一个大哥哥的照片对我说,这是爸爸的学生,他考上了清华大学,他是我们中学的骄傲.长大后,你也要进 ...
- LeetCode15——3Sum
数组中找三个数和为0的结果集 1 // 解法一:先排序 然后固定一个值 然后用求两个数的和的方式 public static List<List<Integer>> three ...
- 最长上升子序列(动态规划递推,LIS)
1759:最长上升子序列 题目: 总时间限制: 2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的 ...