1、附:利用MVC+NHibernate+Jquery+JqueryUI这些技术可以做出一个比较好的前台+后台网站。下面是本人对这些技术的笔记,作为私人年底小结吧。呵呵

好久没写文章了,感觉下不了笔吐不出字来。也许想说的太多,也许压根就不会写了。好吧,省时间,下面就以新增用户功能为例吧。

2、练习用例:

相关DLL:

3、要点:

    (1)NHibernate作用

(2)NHibernate配置

      (3)建用户表、实体以及建立相应的映射

      (4)定义数据访问层接口并实现

      (5)定义业务层接口并实现

(6)控制器Controller实现

(7)视图层展现

(1)NHibernate作用:

  NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。

参阅百度百科:NHibernate

(2)NHibernate配置:

1、配置文件:

2、不同的数据库,NHibernate的配置稍有区别。这里练习用的数据库是MSSQL,所以我们的配置如下:

<?xml version="1.0" encoding="utf-8"?>
<!--
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
for your own use before compile tests in VisualStudio.
-->
<!-- This is the System.Data.OracleClient.dll provider for Oracle from MS -->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">Server=WADE-PC\SQLEXPRESS;initial catalog=TestDB;Integrated Security=SSPI</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property> <property name="query.substitutions">true , false , yes 'Y', no 'N'</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<property name="hbm2ddl.keywords">none</property> </session-factory>
</hibernate-configuration>

在此附上Oracle的配置以便自己以后用:

<!-- This is the System.Data.OracleClient.dll provider for Oracle from MS -->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
<property name="connection.connection_string">
<!--Data Source=SDCGS;user=SDCGS;password=SDCGS2013;Pooling=true;Min Pool Size=;Max Pool Size=-->
Data Source=DMP;user=website;password=website;Pooling=true;Min Pool Size=;Max Pool Size= </property>
<property name="dialect">NHibernate.Dialect.Oracle10gDialect</property>
<property name="query.substitutions">true , false , yes 'Y', no 'N'</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<property name="hbm2ddl.keywords">none</property> </session-factory>
</hibernate-configuration>

(3)建用户表、实体以及建立相应的映射:

①用户表:

②实体类:

注意:1、Serializable——表示可序列化与反序列化。Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

2、DataContract——数据契约。服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送

③实体映射:

  文件——

Code:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Entity" namespace="Entity">
<class name="UserInfo" table="UserInfo">
<id name="UserId" column="UserId" type="int" unsaved-value="0">
<generator class="native" />
</id>
<bag name="UserRoleList" inverse="true" lazy="true" >
<key column="UserId" />
<one-to-many class="UsersInRoles" />
</bag>
<property column="UserName" type="String" name="UserName" />
<property column="PassWord" type="String" name="PassWord" />
</class>
</hibernate-mapping>

  注意:UserInfo.hbm.xml需要设置”属性—复制到输出目录—始终复制”,以及“属性—生成操作—嵌入的资源“。要不然会报错找不到映射文件。

(4)定义数据访问层接口并实现:

①定义数据访问层接口

定义接口代码:(新增用户对应的方法:Save())

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entity;
namespace IDao
{
public interface IUserInfoDao
{ UserInfo Get(int userId);
IList<UserInfo> LoadAll();
object Save(UserInfo entity);
void Update(UserInfo entity);
void Delete(UserInfo entity);
UserInfo Load(object id);
IList<UserInfo> GetListBySql(string sql);
IList<UserInfo> GetListByHQL(string HQL);
IList<Object[]> GetObjectsByHQL(string HQL);
UserInfo GetUserInfoByNameAndPwd(string userName, string pwd);
}
}

②数据访问层接口实现:

实现代码:(新增用户对应的方法:Save())

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IDao;
using NHibernate;
using Entity; namespace Dao
{
public class UserInfoDao : IUserInfoDao
{
/// <summary>
/// 添加
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public object Save(UserInfo entity)
{
ISession session = NHibernateHelper.getSession();
try
{
var id = session.Save(entity);
session.Flush();
return id;
}
finally
{
session.Close();
}
}
}
}

(5)定义业务层接口并实现

①定义业务层接口

定义代码:(对应的方法Save())

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entity; namespace IService
{
public interface IUserInfoService
{
UserInfo getEntityById(int Id);
IList<UserInfo> getAllEntitys();
int AddEntity(UserInfo ar);
void Delete(UserInfo ar);
void UpDate(UserInfo ar);
IList<UserInfo> GetListBySql(string sql);
IList<UserInfo> GetListByHQL(string HQL);
IList<Object[]> GetObjectsByHQL(string HQL); UserInfo GetUserInfoByNameAndPwd(string userName, string pwd);
}
}

②业务层接口并实现

实现代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using IService;
using IDao;
using Entity;
using Dao; namespace Service
{
public class UserInfoService : IUserInfoService
{
private IUserInfoDao dao = new UserInfoDao(); public int AddEntity(UserInfo ar)
{
return int.Parse(dao.Save(ar).ToString());
} }
}

 (6)控制器Controller实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Transactions;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using DotNetOpenAuth.AspNet;
using Microsoft.Web.WebPages.OAuth;
using WebMatrix.WebData;
using BLUS.Filters;
using BLUS.Models;
using Service;
using IService;
using Entity; namespace BLUS.Controllers
{
[Authorize]
[InitializeSimpleMembership]
public class AccountController : Controller
{
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
try
{
IUsersInRolesService sr = new UsersInRolesService();
UserInfo user = new UserInfo();
user.UserName = model.UserName;
user.PassWord = model.Password;
int userId = service.AddEntity(user); UsersInRoles userRole = new UsersInRoles();
userRole.UserId = user;
Entity.Roles rl = new Entity.Roles();
rl.RoleId = 2;
rl.RoleName = "普通用户";
userRole.RoleId= rl;
sr.AddEntity(userRole);
UserInfo userInfoLogin = service.getEntityById(userId);
Session["userInfoLogin"] = null;
Session["userInfoLogin"] = userInfoLogin;
return RedirectToAction("Index", "Home");
}
catch (Exception e)
{
ModelState.AddModelError("", e);
}
} // If we got this far, something failed, redisplay form
return View(model);
}
}
}

   (7)视图层展现:(这里可以省去,视图层的展现)

小结:MVC+NHibernate+Jquery+JqueryUI,结合这些技术可以建立一个功能和性能一般的网站。我也是第一次运用NHibernate,有很多地方都不怎么理解。有待今后继续研究。

年底小回顾(MVC+NHibernate+Jquery+JqueryUI——网站)的更多相关文章

  1. MVC+Nhibernate+jquery+easyui递归实现多级菜单

    1.新建访问的控制器动作返回视图,在视图中使用easyui的treegrid插件来得到后台得到的json数据显示多级菜单 public ActionResult Menu() { return Vie ...

  2. “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构、登录窗口、以及主界面)

    “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构.登录窗口.以及主界面) 一.在上一篇文章中,主要说的就是把主框架搭建起来,并且Nhibernate能达到增 ...

  3. “MVC+Nhibernate+Jquery-EasyUI”信息发布系统 第二篇(数据库结构、登录窗口、以及主界面)

    一.在上一篇文章中,主要说的就是把主框架搭建起来,并且Nhibernate能达到增删改查的地步.测试好之后再来看这篇文章,我的主框架相对来说简答一点,重点还是实现系统的功能,以及对Jquery-Eas ...

  4. MVC中JQuery文件引入的路径问题,@Url.Content函数

    今天写了个MVC的Demo,文件夹结构很简单,如下: 利用EF生成Model框架并手工加表字段注解,但在页面上JS验证始终没显示.实在无语. 无意中在浏览器里按F12,看见提示:   Failed t ...

  5. 【ASP.Net MVC】在AspNet Mvc使用JQuery AutoComplete组件

    在AspNet Mvc使用JQuery AutoComplete组件 官方文档: http://api.jqueryui.com/autocomplete/#entry-examples 要使用JQu ...

  6. “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第六篇(图片新闻的添加以及带分页的静态页的生成)

    “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第六篇(图片新闻的添加以及带分页的静态页的生成) 一.这篇文章主要是要实现:图片新闻的添加,无刷新图片的上传,以及添加新闻静 ...

  7. “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第四篇(用户管理功能的实现)

    “MVC+Nhibernate+Jquery-EasyUI” 信息发布系统 第四篇(用户管理功能的实现) 一.前三篇的内容是否对您有帮助呢?如果有的话,请您继续关注这篇吧,这篇主要是实现”用户管理“的 ...

  8. $Django 路飞之显示视频,Redis存购物车数据,优惠卷生成表,优惠卷的一个领取表。(知识小回顾)

    知识小回顾之json序列化问题 精髓:支持python的几种数据类型(注意不是对象,不能放对象),其次是tuple变list. ensure_ascii:默认值True,如果dict内含有non-AS ...

  9. MVC之Ajax.BeginForm使用详解之更新列表 mvc验证jquery.unobtrusive-ajax

    MVC之Ajax.BeginForm使用详解之更新列表   1.首先,请在配置文件设置如下:(该项默认都存在且为true) <add key="UnobtrusiveJavaScrip ...

随机推荐

  1. Makefile学习(三)执行make

    9 执行make 一般方法:make. 某些情况:1.可能需要使用make更新一部分过时文件而不是全部 2.需要使用另外的编译器或者重新定义编译选项 3.只需要查看哪些文件被修改,不需要重新编译 所以 ...

  2. C++11 静态断言(static_assert)

      简介 C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言. 其语法很简单:static_assert(常量表达式,提示字符串). 如果第一个参数常量表达 ...

  3. TTB 基本

    中文名 ,线程构建模块 外文名 Thread Building Blocks 缩    写 TBB 开    发 intel 目录 1线程构建模块 2黑体亮温 3斜交载重轮胎 4串联球轴承     1 ...

  4. 用JS的for循环打印九九乘法表

    需要使用两个for循环嵌套,代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  5. 获取Excel表中各个Sheet的方法

    获取Excel表中各个Sheet的方法 private void simpleButton2_Click(object sender, EventArgs e) { OfdBOM.Filter = & ...

  6. 新闻滚动marquee标签

    先上代码: <marquee behavior="" direction="up" onMouseOver="this.stop()" ...

  7. ajax请求webservice时抛出终止线程的异常

    请求webservice中以下接口,会抛出异常 {"Message":"正在中止线程.","StackTrace":" 在 Sys ...

  8. AngularJs练习Demo11引入Jquery

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  9. C#this的五种用法

    this的五种用法: 1.使用被掩盖的成员变量: class AA { int a; public void set1(int a) { this.a = a;//right } public voi ...

  10. 使用Flex 和 Red5开发简单视频直播功能

    Flex 是一个高效.免费的开源框架,可用于构建具有表现力的 Web应用程序,这些应用程序利用Adobe Flash Player和Adobe AIR, 可以实现跨浏览器.桌面和操作系统.虽然只能使用 ...