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添加视图方法,就可以运行连接到得到以下结果:

 

 

 

 

原文地址:https://www.cnblogs.com/arraylin/p/3455295.html