zoukankan      html  css  js  c++  java
  • ASP.NET MVC4中使用NHibernate

    1:下载安装NHibernate

    打开 VS 2012新建一个 MVC4项目. 在项目名称上右击选择Manage NuGet Packages。你会看见 Manage Nuget Packages 页面. 在搜索框输入‘NHibernate’ 可以得到以下结果:

    选择第一个并安装,安装完成后会引入以下两个.DLL文件

    • NHibernate

    • Lesi.Collections

    2:编写Model层,你需要决定模型中的对象它们之间的关系现在来定义一个应用程序,用于维护员工记录(很简单但你可以扩展的让我们添加新的类模型。如下所示

     1 public class EmployeeInfo 
     2 { 
     3 int _EmpNo; 
     4 public virtual int EmpNo 
     5 { 
     6   get { return _EmpNo; } 
     7   set { _EmpNo = value; } 
     8 } 
     9 string _EmpName; 
    10 public virtual string EmpName 
    11 { 
    12   get { return _EmpName; } 
    13   set { _EmpName = value; } 
    14 } 
    15 int _Salary;
    16 public virtual int Salary 
    17 { 
    18   get { return _Salary; } 
    19   set { _Salary = value; } 
    20 } 
    21 string _DeptName;
    22 public virtual string DeptName 
    23 { 
    24   get { return _DeptName; } 
    25   set { _DeptName = value; } 
    26 } 
    27 string _Designation;
    28 public virtual string Designation 
    29 { 
    30   get { return _Designation; } 
    31   set { _Designation = value; } 
    32 } 
    33 } 
    View Code

    包含属性employeeinfo这些属性将被用来与表的列映射这些属性必须被定义为虚拟

    3:一旦映射模型类准备好了,现在就可以建数据库保存数据。对于这个简单的应用程序,我们将使用一个名为Company的SQL数据库。表的名称是employeeinfo,创建如下所示:

     1 USE [Company] 
     2 GO 
     3 /****** Object:  Table [dbo].[EmployeeInfo]    Script Date: 1/17/2013 11:22:12 AM ******/ 
     4 SET ANSI_NULLS ON 
     5 GO 
     6 SET QUOTED_IDENTIFIER ON 
     7 GO 
     8 SET ANSI_PADDING ON 
     9 GO 
    10 CREATE TABLE [dbo].[EmployeeInfo]( 
    11     [EmpNo] [int] IDENTITY(1,1) NOT NULL, 
    12     [EmpName] [varchar](50) NOT NULL, 
    13     [Salary] [decimal](18, 0) NOT NULL, 
    14     [DeptName] [varchar](50) NOT NULL, 
    15     [Designation] [varchar](50) NOT NULL, 
    16 CONSTRAINT [PK_EmployeeInfo] PRIMARY KEY CLUSTERED 
    17 ( 
    18     [EmpNo] ASC 
    19 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    20 ) ON [PRIMARY] 
    21 GO 
    22 SET ANSI_PADDING OFF 
    23 GO 
    View Code

    4:设置映射employeeinfo.HBM.XML

    在Models中建立NHibernate 文件夹,在NHibernate下建立Configuration 、Mappings两个文件夹

    映射文件的命名规则默认是< modelName >.hbm.xml,在我们的案例中,它取名为employeeinfo.HBM.XML,保存在ModelsMappings,我们需要在项目中将XML文件属性改为嵌入的资源的“。这个文件映射模型类与数据库表列的约束的主键,数据类型等文件,如下所示:

     1 <?xml version="1.0" encoding="utf-8" ?> 
     2 <hibernate-mapping 
     3 xmlns="urn:nhibernate-mapping-2.2" 
     4 assembly="MVC4_Using_NHB" 
     5 namespace="MVC4_Using_NHB" 
     6 auto-import="true"> 
     7 <class name="MVC4_Using_NHB.Models.EmployeeInfo,MVC4_Using_NHB"> 
     8   <id name="EmpNo" access="property" column="EmpNo" type="Int32"> 
     9    <generator class="native"></generator> 
    10   </id> 
    11   <property name="EmpName" access="property" 
    12    column="EmpName" type="String"></property> 
    13   <property name="Salary" access="property" 
    14    column="Salary" type="Int32"></property> 
    15   <property name="DeptName" access="property" 
    16    column="DeptName" type="String"></property> 
    17   <property name="Designation" access="property" 
    18    column="Designation" type="String"></property> 
    19   </class> 
    20 </hibernate-mapping> 
    View Code

    上述XML文件是employeeinfo类和属性之间的映射的列。

    注:默认情况下没有智能代码提示,可以实现添加nhibernate-configuration.xsd和nhibernate-mapping.xsd文件到VS的以下路径:

    C:Program Files (x86)Microsoft Visual Studio 11.0XmlSchemas,就会有代码提示。

     

    5:一旦定义了映射,就可以定义应用程序的NHibernate配置。这提供了连接数据库信息,连接字符串,用于连接映射文件。在项目中ModelsConfiguration文件夹建一个新的XML文件;该文件的名称是‘hibernate.CFG.XML的。在添加以下配置:

     1 <?xml version="1.0" encoding="utf-8" ?> 
     2 <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
     3 <session-factory> 
     4   <property name="connection.provider">
     5 NHibernate.Connection.DriverConnectionProvider</property> 
     6   <property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property> 
     7   <property name="connection.driver_class">
     8 NHibernate.Driver.SqlClientDriver</property> 
     9   <property name="connection.connection_string">Data Source=.;Initial Catalog=Company;Integrated Security=SSPI</property> 
    10   <property name="show_sql">false</property> 
    11 </session-factory> 
    12 </hibernate-configuration>
    View Code

     

     

    6:现在是时候添加一些代码来对数据库映射模型进行CRUD操作NHibernate提供用于执行操作的各个类和接口其中一些是用于实现他们如下

    ISession单线程,生命期较短的对象,代表应用程序和持久化层之间的一次对话。封装了一个ADO.NET连接

    ISessionFactory:它是Session的工厂,是ConnectionProvider的客户。可以持有一个可选的(第二级)数据缓存,可以在进程级别或集群级别保存的可以在事物中重用的数据。。该方法的opensession()”提供了创建Session的功能每个数据库要求一个会话工厂。执行是线程安全的,可以一直到应用程序的生存时间。

    正如你可以看到下面的代码,我们必须配置对象提供的配置文件的绝对路径,也为其提供了目录信息的所有映射文件将被保存(在opensession法)

    iquery:这表示是NHibernate查询一个对象。

     1 /// <summary> 
     2 /// class to perform the CRUD operations 
     3 /// </summary> 
     4 public class EmployeeInfoDAL 
     5 { 
     6 //Define the session factory, this is per database 
     7 ISessionFactory sessionFactory; 
     8 /// <summary> 
     9 /// Method to create session and manage entities 
    10 /// </summary> 
    11 /// <returns></returns> 
    12 ISession OpenSession() 
    13 { 
    14   if (sessionFactory == null) 
    15   { 
    16    var cgf = new Configuration(); 
    17    var data = cgf.Configure( 
    18          HttpContext.Current.Server.MapPath( 
    19             @"ModelsNHibernateConfigurationhibernate.cfg.xml")); 
    20    cgf.AddDirectory(new System.IO.DirectoryInfo( 
    21          HttpContext.Current.Server.MapPath(@"ModelsNHibernateMappings"))); 
    22    sessionFactory = data.BuildSessionFactory(); 
    23   } 
    24   return sessionFactory.OpenSession(); 
    25 } 
    26 public IList<EmployeeInfo> GetEmployees() 
    27 { 
    28   IList<EmployeeInfo> Employees; 
    29   using (ISession session = OpenSession()) 
    30   { 
    31    //NHibernate query 
    32    IQuery query = session.CreateQuery("from EmployeeInfo"); 
    33    Employees = query.List<EmployeeInfo>(); 
    34   } 
    35   return Employees; 
    36 } 
    37 public EmployeeInfo GetEmployeeById(int Id) 
    38 { 
    39   EmployeeInfo Emp = new EmployeeInfo(); 
    40   using (ISession session = OpenSession()) 
    41   { 
    42    Emp = session.Get<EmployeeInfo>(Id); 
    43   } 
    44   return Emp; 
    45 } 
    46 public int CreateEmployee(EmployeeInfo Emp) 
    47 { 
    48   int EmpNo = 0; 
    49   using (ISession session = OpenSession()) 
    50   { 
    51    //Perform transaction 
    52    using (ITransaction tran = session.BeginTransaction()) 
    53    { 
    54     session.Save(Emp); 
    55     tran.Commit(); 
    56    } 
    57   } 
    58   return EmpNo; 
    59 }
    60 public void UpdateEmployee(EmployeeInfo Emp) 
    61 { 
    62   using (ISession session = OpenSession()) 
    63   { 
    64    using (ITransaction tran = session.BeginTransaction()) 
    65    { 
    66     session.Update(Emp); 
    67     tran.Commit(); 
    68    } 
    69   } 
    70 }
    71 public void DeleteEmployee(EmployeeInfo Emp) 
    72 { 
    73   using (ISession session = OpenSession()) 
    74   { 
    75    using (ITransaction tran = session.BeginTransaction()) 
    76    { 
    77     session.Delete(Emp); 
    78     tran.Commit(); 
    79    } 
    80   } 
    81 } 
    82 } 
    View Code

    生成项目并确保它没有错误。

     

    7:添加新控制器,命名为“employeeinfocontroller”。添加下面的控制器类中的动作方法:

     1 using MVC4_Using_NHB.Models; 
     2 using System.Web.Mvc;
     3 namespace MVC4_Using_NHB.Controllers 
     4 { 
     5 public class EmployeeInfoController : Controller 
     6 { 
     7   EmployeeInfoDAL objDs; 
     8   public EmployeeInfoController() 
     9   { 
    10    objDs = new EmployeeInfoDAL(); 
    11   } 
    12   // 
    13   // GET: /EmployeeInfo/ 
    14   public ActionResult Index() 
    15   { 
    16    var Employees = objDs.GetEmployees(); 
    17    return View(Employees); 
    18   } 
    19 // 
    20 // GET: /EmployeeInfo/Details/5
    21 public ActionResult Details(int id) 
    22 { 
    23   return View(); 
    24 } 
    25 // 
    26 // GET: /EmployeeInfo/Create 
    27 public ActionResult Create() 
    28 { 
    29   var Emp = new EmployeeInfo(); 
    30   return View(Emp); 
    31 } 
    32 // 
    33 // POST: /EmployeeInfo/Create 
    34 [HttpPost] 
    35 public ActionResult Create(EmployeeInfo Emp) 
    36 { 
    37   try 
    38   { 
    39    objDs.CreateEmployee(Emp); 
    40    return RedirectToAction("Index"); 
    41   } 
    42   catch 
    43   { 
    44    return View(); 
    45   } 
    46 } 
    47 // 
    48 // GET: /EmployeeInfo/Edit/5 
    49 public ActionResult Edit(int id) 
    50 { 
    51   var Emp = objDs.GetEmployeeById(id); 
    52   return View(Emp); 
    53 } 
    54 // 
    55 // POST: /EmployeeInfo/Edit/5 
    56 [HttpPost] 
    57 public ActionResult Edit(int id, EmployeeInfo Emp) 
    58 { 
    59   try 
    60   { 
    61    objDs.UpdateEmployee(Emp); 
    62    return RedirectToAction("Index"); 
    63   } 
    64   catch 
    65   { 
    66    return View(); 
    67   } 
    68 }
    69 // 
    70 // GET: /EmployeeInfo/Delete/5 
    71 public ActionResult Delete(int id) 
    72 { 
    73   var Emp = objDs.GetEmployeeById(id); 
    74   return View(Emp); 
    75 } 
    76 // 
    77 // POST: /EmployeeInfo/Delete/5 
    78 [HttpPost] 
    79 public ActionResult Delete(int id,FormCollection collection) 
    80 { 
    81   try 
    82   { 
    83    var Emp = objDs.GetEmployeeById(id); 
    84    objDs.DeleteEmployee(Emp);   
    85    return RedirectToAction("Index"); 
    86   } 
    87   catch 
    88   { 
    89    return View(); 
    90   } 
    91 } 
    92 } 
    View Code

    每个动作方法调用的employeeinfodal类定义的方法。现在只要为每个Action添加视图方法,就可以运行连接到得到以下结果:

     

     

     

     

  • 相关阅读:
    Selenium WebDriver基础操作教程
    C# 运行cmd 并 执行命令语句
    【JAVA习题二】判断101-200之间有多少个素数,并输出所有素数。
    【JAVA习题一】古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?
    【JAVA随摘笔记一】进制转换
    【C++初学者自学笔记三】哑元函数、缺省参数、内联函数(模块二,PS:需要用到重载函数)
    【C++初学者自学笔记二】函数重载(模块一)
    【JAVA蓝桥杯】基础练习2 十六进制转十进制
    【JAVA蓝桥杯】基础练习1 十进制转十六进制
    【C++初学者自学笔记一】(把自己刚学到的东西做一下总结,如果有哪些地方不足请留言指正)
  • 原文地址:https://www.cnblogs.com/arraylin/p/3455295.html
Copyright © 2011-2022 走看看