ASP.NET MVC4中使用NHibernate

1:下载安装NHibernate

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

ASP.NET MVC4中使用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,保存在Models\Mappings,我们需要在项目中将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.0\Xml\Schemas,就会有代码提示。

 

5:一旦定义了映射,就可以定义应用程序的NHibernate配置。这提供了连接数据库信息,连接字符串,用于连接映射文件。在项目中Models\Configuration文件夹建一个新的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             @"Models\NHibernate\Configuration\hibernate.cfg.xml")); 

20    cgf.AddDirectory(new System.IO.DirectoryInfo( 

21          HttpContext.Current.Server.MapPath(@"Models\NHibernate\Mappings"))); 

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

 

 

 

 

 

 

 

 

你可能感兴趣的:(Hibernate)