ASP.NET MVC NHibernate 整合
请注明转载地址:http://www.cnblogs.com/arhat
在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做。同理这个三个技术也是。那么在整合之前,需要对
ASP.NET,Spring.NET,NHibernate有所了解,最好是有一些经验,因为平白无故的就把3个技术融合到一起,会闹些小别扭,其实就像配置化学药品一样,如果3中原料有一点出路,那么整个实验也就失败了。
在网上有很多高人都写过类似的文章,可能是鄙人不才,看了很多文章都没有把我的问题解决了,同时我在整合的过程中走了不少的弯路。今天做一下记录,防止自己忘掉。好了,言归正传。
整合原理:
我们在初中,高中都学过化学,知道有些物质是不能很好的反应,需要通过催化剂来促使两者之间更改好的反应。那么我们就把ASP.NET MVC看成是物质A,NHibernate看成是物质C。本身A+C=应用。但是由于A和C之间结合会带来开发上的一些难题(比如事务的控制),那么怎么办呢,我们可以加入催化剂Spring.NET(物质B)。这样通过B这个催化剂很好的解决了A+C之间的问题。于是公式就出来了A+B+C=应用。
当然,我们这里是程序设计而不是化学反应,所以在结合的过程中我们遵循下面的步骤。
1. ASP.NET + Spring.NET
2. ASP.NET + NHibernate
3. ASP.NET +Spring.NET +NHibernate

一、ASP.Net MVC与NHibernate整合
首先我们建立一个空的解决方案“MVCNHibernate”。在解决方案中加入三个个项目,一个Web项目,两个类库项目。如图所示:
这里我们使用的是NHibernate-3.2.0。
1. 在DAL项目中,我们加入:
Iesi.Collections.dll,NHibernate.dll的引用。
2. 配置Web.config
<configSections>
<section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
</configSections>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
<property name="show_sql">true</property>
<property name="current_session_context_class">web</property>
<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
<property name="connection.connection_string">
persistsecurityinfo=True;server=127.0.0.1;user id=root;password=symjie;database=nhibernate
</property>
<mapping assembly="" />
</session-factory>
</hibernate-configuration>
其中青色部分先设置为空,这个是用来设置*.hbm.xml文件,也就是映射文件。
3. 创建User.cs和User.hbm.xml文件
在Com.Symjie.Model项目中,添加一个User.cs,并添加一个Config文件夹。
User.cs文件如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Collections.Generic;
namespace Com.Symjie.Model
{
public partial class User {
partial void OnCreated();
public User()
{
OnCreated();
}
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual string Pwd
{
get;
set;
}
}
}
在Config文件夹中创建User.hbm.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping assembly="Com.Symjie.Model" namespace="Com.Symjie.Model" xmlns="urn:nhibernate-mapping-2.2">
<class name="User" table="users" schema="nhibernate">
<id name="Id" type="Int32">
<column name="id" not-null="true" precision="11" scale="0" sql-type="int" />
<generator class="identity" />
</id>
<property name="Name" type="String">
<column name="name" not-null="true" length="64" sql-type="varchar" />
</property>
<property name="Pwd" type="String">
<column name="pwd" not-null="true" length="128" sql-type="varchar" />
</property>
</class>
</hibernate-mapping>
并把User.hbm.xml文件设置为潜入的资源。

同时更改Web.config文件:
把<mapping assembly="" />改为<mapping assembly="Com.Symjie.Model" />
4. 在Com.Symjie.DAL项目中创建D_User.cs和NHibernateHelper.cs
NHibernateHelper.cs内容如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
namespace Com.Symjie.DAL
{
public sealed class NHibernateHelper
{
static ISessionFactory instance = null;
static readonly object padlock = new object();
NHibernateHelper()
{
}
private static ISessionFactory Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new Configuration().Configure().BuildSessionFactory();
}
return instance;
}
}
}
public static ISession OpenSession()
{
return Instance.OpenSession();
}
/*报错,暂时不用,而到最后使用Spring.NET来管理。
public static ISession GetCurrentSession()
{
return Instance.GetCurrentSession();
}*/
public static T Get<T>(object id)
{
T t = default(T);
ISession session = NHibernateHelper.OpenSession();
ITransaction tran = session.BeginTransaction();
try
{
t = session.Get<T>(id);
tran.Commit();
return t;
}
catch (Exception ex)
{
tran.Rollback();
throw new Exception(ex.Message);
}
finally
{
if (session != null && session.IsOpen)
{
session.Close();
}
}
}
public static T UniqueQuery<T>(string hql, params string[] param)
{
T t = default(T);
ISession session = NHibernateHelper.OpenSession();
ITransaction tran = session.BeginTransaction();
try
{
IQuery query = session.CreateQuery(hql);
if (param != null)
{
for (int i = ; i < param.Length; i++)
{
query.SetString(i, param[i]);
}
}
t = query.UniqueResult<T>();
return t;
}
catch (Exception ex)
{
tran.Rollback();
throw new Exception(ex.Message);
}
finally
{
if (session != null && session.IsOpen)
{
session.Close();
}
}
}
public static List<T> ExecuteQuery<T>(string hql, params string[] param)
{
ISession session = NHibernateHelper.OpenSession();
ITransaction tran = session.BeginTransaction();
List<T> list = null;
try
{
IQuery query = session.CreateQuery(hql);
if (param != null)
{
for (int i = ; i < param.Length; i++)
{
query.SetParameter(i, param[i]);
}
}
list = query.List<T>() as List<T>;
tran.Commit();
return list;
}
catch (Exception ex)
{
tran.Rollback();
throw new Exception(ex.Message);
}
finally
{
if (session != null && session.IsOpen)
{
session.Close();
}
}
}
}
}
D_User.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
namespace Com.Symjie.DAL
{
public class D_User
{
public List<Model.User> GetAllUsers()
{
return NHibernateHelper.ExecuteQuery<Model.User>("from User", null);
}
}
}
5. 在Web项目中,添加一个HomeConroller和视图,内容如下
HomeController.cs
public class HomeController : Controller
{
private DAL.D_User dal = new DAL.D_User();
public ActionResult Index()
{
List<Model.User> list = dal.GetAllUsers();
ViewBag.Data = list;
return View();
}
}
Index.cshtml
@using Com.Symjie.Model;
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<div>
@foreach (User user in ViewBag.Data)
{
@user.Name;
}
</div>
</body>
</html>
执行,我们就会看到效果。
在本节中,我们写了一个NHibernateHelper的帮助类,这个类可以说是模仿JAVA写的,但是对于GetCurrentSession这个方法一直有问题,不知道到底怎么回事,报了“No Hibernate Session bound to thread, and configuration does not allow”这个错误。很是郁闷,但是没关系,到下一节,我们使用Spring.NET来管理NHibernate就可以解决这个问题。
好了,这一章节到此结束,本章把ASP.NET MVC 和 NHibernate只是一个简单的组合。下一章节,我们将讲解ASP.NET MVC 和 Spring.NET,NHibernate的结合。
ASP.NET MVC NHibernate 整合的更多相关文章
- Ioc容器Autofac系列(2)-- asp.net mvc中整合autofac
经过上篇蜻蜓点水的介绍后,本篇通过实例快速上手autofac,展示当asp.net mvc引入了autofac之后会带来什么. 创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点 ...
- Asp.net mvc中整合autofac
创建Asp.net MVC并引入Autofac 首先,创建一个MVC站点,为方便起见,选初始带HomeController和AccountController的那种.然后通过NuGet或到Autofa ...
- C#结合js 上传文件和删除文件(技术点有:asp.net mvc ,nhibernate,ajax等)
之前做项目的时候要用到上传文件的功能,现在我总结一下,上传文件和删除文件的代码,在以后的使用的过程中也更方便查找. [HttpPost] public ActionResult EditUser() ...
- [转]ASP.NET MVC Spring.NET NHibernate 整合
请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...
- ASP.NET MVC Spring.NET NHibernate 整合
请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...
- ASP.NET MVC3 中整合 NHibernate3.3、Spring.NET2.0 时 Session 关闭问题
一.问题描述 在向ASP.NET MVC中整合NHibernate.Spring.NET后,如下管理员与角色关系: 类public class Admin { public virtual strin ...
- Asp.Net MVC大型项目实践整合 NHibernate与Json序列化
通过NHibernate我们多表查询是实现了 但由于查询出来的集合中的对象“不是平的”,如何在送到UI绑定成了问题.ExtJs UI组件的数据绑定支持多种格式,如简单数组,Json,Xml.在本项目中 ...
- ASP.NET MVC Spring.NET 整合
请注明转载地址:http://www.cnblogs.com/arhat 在整合这三个技术之前,首先得说明一下整合的步骤,俗话说汗要一口一口吃,事要一件一件做.同理这个三个技术也是.那么在整合之前,需 ...
- 4、ASP.NET MVC入门到精通——NHibernate构建一个ASP.NET MVC应用程序
下周就去办理离职手续了,之前没有使用过NHibernate,只知道NHibernate是一种ORM框架,但是听说新公司是使用NHibernate在做项目,所以,我就网上找资料学习一下NHibernat ...
随机推荐
- iOS开发几年了,你清楚OC中的这些东西么1
前言 几年前笔者是使用Objective-C进行iOS开发, 不过在两年前Apple发布swift的时候,就开始了swift的学习, 在swift1.2发布后就正式并且一直都使用了swift进行iOS ...
- iOS之pch文件的正确使用
在Xcode6之前,创建一个新工程xcode会在Supporting files文件夹下面自动创建一个“工程名-Prefix.pch”文件,也是一个头文件,pch头文件的内容能被项目中的其他所有源文件 ...
- posix thread互斥量
互斥量 互斥量(Mutex)是“mutual exclusion”的缩写.互斥量是实现线程同步,和保护同时写共享数据的主要方法.使用互斥量的典型顺序如下:1. 创建和初始一个互斥量 2. 多个线程尝试 ...
- JAXB - Annotations, Top-level Elements: XmlRootElement
A class that describes an XML element that is to be a top-level element, i.e., one that can function ...
- sql 理解视图
可以看作是定义在sqlserver上的虚拟的表,本身并不存储数据,仅仅存储一个select语句和涉及的表的引用 通过视图,客户端不再需要知道底层表结构和其之间的关系,视图提供了一个统一访问数据的接口 ...
- VS2012无法创建项目:未找到与约束……匹配的导出
故障情况:7月10号后用VS2012创建项目时,弹出如下对话框,无法创建新项目: 而后经网络搜索确定是7月10号更新了系统补丁后造成的 解决方案: 1.卸载这两个补丁后重启电脑: 2.到http:// ...
- 使用for xml path 分组查询
SELECT OLevel, WorkOrgID, WorkOrgName, PlanNum, PlanFinishNum, PlanUnFinishNum, PlanCanceledNum, P ...
- HTML5标签及使用方法描述
HTML 5 作为新一代的超文本标记语言,增加了许多标签.这些标签不但更有语义,而且功能强大.具体有以下标签: <article> 定义外部的内容.比如来自一个外部的新闻提供者的一篇新的文 ...
- Thread多线程stopSleep顺序问题
今天呢,学习了javase多线程,里面的睡眠sleep问题有点困扰: public class Thread_06_stopSleep{ public static void main(String[ ...
- [译]JavaScript 错误和处理
JavaScript的调试是一个噩梦:一些错误刚开始很难理解,并且给出的错误函数也经常是没用的.如果把错误都列出来并给出解决办法会不会很有用呢. 下面列出了JavaScript一系列的奇怪错误.对于同 ...