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 ...
随机推荐
- 显示/去掉CONSOLE窗口
众所周知,控制台应用程序一般都会显示一个控制台窗口(虚拟DOS窗口),但很多时候控制台程序的执行逻辑根本不需要与用户进行交互,所以显示这个难看的窗口纯属多余,那么如何将它屏蔽掉呢?下面我向大家介绍一种 ...
- 三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别
关于inflate参数问题,我想很多人多多少少都了解一点,网上也有很多关于这方面介绍的文章,但是枯燥的理论或者翻译让很多小伙伴看完之后还是一脸懵逼,so,我今天想通过三个案例来让小伙伴彻底的搞清楚这个 ...
- sqlite数据下载链接地址
链接: http://pan.baidu.com/s/1pJN1abT 密码: yjg5
- [转]SQL Server 和Oracle 数据类型对应
本文转自:http://blog.sina.com.cn/s/blog_681cd80d0100q84t.html SqlServer 2k转换为Oracle 10g 列名 SqlServer数据类型 ...
- 类名.class与类名.this详解
类名.class 我们知道在java中,一个类在被加载的时候虚拟机就会自动的生成一个这个类的一个Class类型的“类对象”,每个类都对应着一个这样的类对象,通过这个Class类型的类对象,我 ...
- golang 依赖控制反转(IoC)
主流开发语言,为了达到项目间的低耦合,都会借助IoC框架来实现.即抽象和实现分离,使用抽象层,不用关心这些抽象层的具体实现:抽象层的实现,可以独立实现.现在比较流行的领域驱动设计(ddd),为了达到将 ...
- 【MINA】序列化和反序列化我们要考虑的问题
概念 序列化:将java对象转换为字节序列的过程叫做序列化 反序列化:将字节对象转换为java对象的过程叫做反序列化 要解决的问题 1.序列化时间 2.反序列化时间 3.bytes大小 4.操作方便 ...
- ASP实现https和http之间转化
HTTPS 是一个安全通信信道,用于在客户计算机和服务器之间交换信息.它使用安全套接字层 (SSL). HTTPS (Secure Hypertext Transfer Protocol) 安全超文本 ...
- 2 WPF之XMAL----XMAL概览
转载:http://blog.csdn.net/fwj380891124/article/details/8085458 微软为了把开发模式从网络开发移植到桌面开发和富媒体网络程序的开发上,微软创造了 ...
- anyConnect连接VPN后无法上网
最近想使用学校图书馆的VPN, 使用的是anyConnect的客户端.每次连接后都显示连接成功,但是马上就无法上网了. 开始以为是win10系统不兼容的问题,在虚拟机里面用win7测试可以成功,但是因 ...