一,摘要
在本篇文章中我們覆蓋如何安裝配置Nhibernate,以及在MVC中如何使用它.
二,什么是Nhibernate
Nhibernate是一個應用于.NET中的對象-關系映射器,它將對象模型映射到關系型數據庫,在本文中你將看到Nhibernate處理大部分持久層相關聯的任務.
三,安裝Nhibernate
下載壓縮包,并且解壓到你的電腦上,這樣就安裝好了.
四,創建ASP.NET MVC項目
創建一個新的MVC項目,伴隨著單元測試項目.添加兩個類庫:Infrastructure與Core.這是一個非常簡單的模型幫助我們理解Nhibernate是如何工作的:一個博客帖子屬于一個或者多個類別,一個類別可能擁有一個或者多個帖子
我們將使用SQL Server2008速成版創建我們的數據庫,當然也可以在Visual Studio里創建模型,然后通過編寫Nhibernate配置去創建數據庫.
五,創建模型
下一步去創建我們的模型,它是我們的數據庫面向對象的表現,我們將使用Visual Studio的類設計器創建它
六,Repositories
repository允許我們去創建,查詢,更新,刪除我們的對象.repository獨立于數據庫.我們將創建2個repository:PostRepository與CategoryRepository,兩個repositorys將實現如下接口:
IRepository.cs
1: using System;
<!--CRLF-->
2: using System.Collections.Generic;
<!--CRLF-->
3: using System.Linq;
<!--CRLF-->
4: using System.Text;
<!--CRLF-->
5: using System;
<!--CRLF-->
6: using System.Collections.Generic;
<!--CRLF-->
7: using System.Linq;
<!--CRLF-->
8: using System.Text;
<!--CRLF-->
9:
<!--CRLF-->
10: namespace Core
<!--CRLF-->
11: {
<!--CRLF-->
12: public interface IRepository<t></t>
<!--CRLF-->
13: {
<!--CRLF-->
14: void Save(T entity);
<!--CRLF-->
15: void Update(T entity);
<!--CRLF-->
16: void Delete(Guid id);
<!--CRLF-->
17: T GetById(Guid id);
<!--CRLF-->
18: T GetAll();
<!--CRLF-->
19: }
<!--CRLF-->
20: }
<!--CRLF-->
去創建repositorys,我們首先需要創建一個輔助類NHibernate session
NHibernateHelper.cs
1: using System;
<!--CRLF-->
2: using System.Collections.Generic;
<!--CRLF-->
3: using System.Linq;
<!--CRLF-->
4: using System.Text;
<!--CRLF-->
5: using NHibernate.Cfg;
<!--CRLF-->
6: using NHibernate;
<!--CRLF-->
7:
<!--CRLF-->
8: namespace Core.Domain.Repositories
<!--CRLF-->
9: {
<!--CRLF-->
10: public class NHibernateHelper
<!--CRLF-->
11: {
<!--CRLF-->
12: private static ISessionFactory _sessionFactory;
<!--CRLF-->
13:
<!--CRLF-->
14: private static ISessionFactory SessionFactory
<!--CRLF-->
15: {
<!--CRLF-->
16: get
<!--CRLF-->
17: {
<!--CRLF-->
18: if (_sessionFactory == null)
<!--CRLF-->
19: {
<!--CRLF-->
20: var configuration = new Configuration();
<!--CRLF-->
21: configuration.Configure();
<!--CRLF-->
22: _sessionFactory = configuration.BuildSessionFactory();
<!--CRLF-->
23: }
<!--CRLF-->
24: return _sessionFactory;
<!--CRLF-->
25: }
<!--CRLF-->
26: }
<!--CRLF-->
27:
<!--CRLF-->
28: public static ISession OpenSession()
<!--CRLF-->
29: {
<!--CRLF-->
30: return SessionFactory.OpenSession();
<!--CRLF-->
31: }
<!--CRLF-->
32: }
<!--CRLF-->
33: }
<!--CRLF-->
下一步我們創建repositorys
PostRepository.cs
1: using System;
<!--CRLF-->
2: using System.Collections.Generic;
<!--CRLF-->
3: using System.Linq;
<!--CRLF-->
4: using System.Text;
<!--CRLF-->
5: using Core.Domain.Model;
<!--CRLF-->
6: using NHibernate;
<!--CRLF-->
7: using NHibernate.Criterion;
<!--CRLF-->
8:
<!--CRLF-->
9: namespace Core.Domain.Repositories
<!--CRLF-->
10: {
<!--CRLF-->
11: public class PostRepository: IRepository<post></post>
<!--CRLF-->
12: {
<!--CRLF-->
13: #region IRepository<post> Members</post>
<!--CRLF-->
14:
<!--CRLF-->
15: void IRepository<post>.Save(Post entity)</post>
<!--CRLF-->
16: {
<!--CRLF-->
17: using (ISession session = NHibernateHelper.OpenSession())
<!--CRLF-->
18: {
<!--CRLF-->
19: using (ITransaction transaction = session.BeginTransaction())
<!--CRLF-->
20: {
<!--CRLF-->
21: session.Save(entity);
<!--CRLF-->
22: transaction.Commit();
<!--CRLF-->
23: }
<!--CRLF-->
24: }
<!--CRLF-->
25: }
<!--CRLF-->
26:
<!--CRLF-->
27: void IRepository<post>.Update(Post entity)</post>
<!--CRLF-->
28: {
<!--CRLF-->
29: using (ISession session = NHibernateHelper.OpenSession())
<!--CRLF-->
30: {
<!--CRLF-->
31: using (ITransaction transaction = session.BeginTransaction())
<!--CRLF-->
32: {
<!--CRLF-->
33: session.Update(entity);
<!--CRLF-->
34: transaction.Commit();
<!--CRLF-->
35: }
<!--CRLF-->
36: }
<!--CRLF-->
37: }
<!--CRLF-->
38:
<!--CRLF-->
39: void IRepository<post>.Delete(Guid id)</post>
<!--CRLF-->
40: {
<!--CRLF-->
41: using (ISession session = NHibernateHelper.OpenSession())
<!--CRLF-->
42: {
<!--CRLF-->
43: using (ITransaction transaction = session.BeginTransaction())
<!--CRLF-->
44: {
<!--CRLF-->
45: session.Delete(id);
<!--CRLF-->
46: transaction.Commit();
<!--CRLF-->
47: }
<!--CRLF-->
48: }
<!--CRLF-->
49: }
<!--CRLF-->
50:
<!--CRLF-->
51: Post IRepository<post>.GetById(Guid id)</post>
<!--CRLF-->
52: {
<!--CRLF-->
53: using (ISession session = NHibernateHelper.OpenSession())
<!--CRLF-->
54: return session.CreateCriteria<post>().Add(Restrictions.Eq(<span style="color: #006080">"Id"</span>, id)).UniqueResult<post>();</post></post>
<!--CRLF-->
55: }
<!--CRLF-->
56:
<!--CRLF-->
57: Post IRepository<post>.GetAll()</post>
<!--CRLF-->
58: {
<!--CRLF-->
59: throw new NotImplementedException();
<!--CRLF-->
60: }
<!--CRLF-->
61:
<!--CRLF-->
62: #endregion
<!--CRLF-->
63: }
<!--CRLF-->
64: }
<!--CRLF-->
CategoryRepository.cs
1: using System;
<!--CRLF-->
2: using System.Collections.Generic;
<!--CRLF-->
3: using System.Linq;
<!--CRLF-->
4: using System.Text;
<!--CRLF-->
5: using Core.Domain.Model;
<!--CRLF-->
6: using NHibernate;
<!--CRLF-->
7: using NHibernate.Criterion;
<!--CRLF-->
8:
<!--CRLF-->
9: namespace Core.Domain.Repositories
<!--CRLF-->
10: {
<!--CRLF-->
11: public class CategoryRepository: IRepository<category></category>
<!--CRLF-->
12: {
<!--CRLF-->
13: #region IRepository<category> Members</category>
<!--CRLF-->
14:
<!--CRLF-->
15: void IRepository<category>.Save(Category entity)</category>
<!--CRLF-->
16: {
<!--CRLF-->
17: using (ISession session = NHibernateHelper.OpenSession())
<!--CRLF-->
18: {
<!--CRLF-->
19: using (ITransaction transaction = session.BeginTransaction())
<!--CRLF-->
20: {
<!--CRLF-->
21: session.Save(entity);
<!--CRLF-->
22: transaction.Commit();
<!--CRLF-->
23: }
<!--CRLF-->
24: }
<!--CRLF-->
25: }
<!--CRLF-->
26:
<!--CRLF-->
27: void IRepository<category>.Update(Category entity)</category>
<!--CRLF-->
28: {
<!--CRLF-->
29: using (ISession session = NHibernateHelper.OpenSession())
<!--CRLF-->
30: {
<!--CRLF-->
31: using (ITransaction transaction = session.BeginTransaction())
<!--CRLF-->
32: {
<!--CRLF-->
33: session.Update(entity);
<!--CRLF-->
34: transaction.Commit();
<!--CRLF-->
35: }
<!--CRLF-->
36: }
<!--CRLF-->
37: }
<!--CRLF-->
38:
<!--CRLF-->
39: void IRepository<category>.Delete(Guid id)</category>
<!--CRLF-->
40: {
<!--CRLF-->
41: using (ISession session = NHibernateHelper.OpenSession())
<!--CRLF-->
42: {
<!--CRLF-->
43: using (ITransaction transaction = session.BeginTransaction())
<!--CRLF-->
44: {
<!--CRLF-->
45: session.Delete(id);
<!--CRLF-->
46: transaction.Commit();
<!--CRLF-->
47: }
<!--CRLF-->
48: }
<!--CRLF-->
49: }
<!--CRLF-->
50:
<!--CRLF-->
51: Category IRepository<category>.GetById(Guid id)</category>
<!--CRLF-->
52: {
<!--CRLF-->
53: using (ISession session = NHibernateHelper.OpenSession())
<!--CRLF-->
54: return session.CreateCriteria<category>().Add(Restrictions.Eq(<span style="color: #006080">"Id"</span>, id)).UniqueResult<category>();</category></category>
<!--CRLF-->
55: }
<!--CRLF-->
56:
<!--CRLF-->
57: Category IRepository<category>.GetAll()</category>
<!--CRLF-->
58: {
<!--CRLF-->
59: throw new NotImplementedException();
<!--CRLF-->
60: }
<!--CRLF-->
61:
<!--CRLF-->
62: #endregion
<!--CRLF-->
63: }
<!--CRLF-->
64: }
<!--CRLF-->
我們看到在Repository中首先創建Session然后調用Nhibernate中的方法
七,回顧
到目前為止,我們做了如下事情:
1.創建Core類庫,引用Nhibernate程序集
2.在Core類庫里我們創建了兩個模型類:"Post.cs”,"Category.cs”,post類有一個指向category類的集合
3.創建了兩個Repository去查詢,更新,刪除,編輯我們的模型
八,映射
現在在我們的Infrastructure類庫中創建模型層到數據庫的映射,我們需要在Nhibernate中配置XML文件,命名遵循[ClassName].hbm.xml的規范
我們將創建兩個新文件:Category.hbm.xml 與Post.hbm.xml,每一個類映射到數據庫中的一張表,屬性映射到表中的列,當然你也能制定數據類型,首先我們創建Category.hbm.xml文件:
1: xml version ="1.0" encoding ="utf-8" ? >
<!--CRLF-->
2: hibernate-mapping xmlns ="urn:nhibernate-mapping-2.2"
<!--CRLF-->
3: namespace ="Core.Domain.Model"
<!--CRLF-->
4: assembly ="Core" >
<!--CRLF-->
5:
<!--CRLF-->
6: class name ="Category" table ="Categories" dynamic-update ="true" >
<!--CRLF-->
7: cache usage ="read-write" />
<!--CRLF-->
8: id name ="Id" column ="Id" type ="Guid" >
<!--CRLF-->
9: generator class ="guid" />
<!--CRLF-->
10: id >
<!--CRLF-->
11: property name ="Name" length ="100" />
<!--CRLF-->
12: class >
<!--CRLF-->
13: hibernate-mapping >
<!--CRLF-->
注意:一定要設置每個映射文件的簡歷動作為"Embedded Resource",這樣Nhibernate就能在程序集中找到正確的文件
九,配置Nhibernate
下一步我們在hibernate.cfg.xml文件中設置Nhibernate的連接以及參數,在動態代理系統中,Nhibernate有一個"Lazy-Loading"特性,我們需要添加如下程序集去支持它:
1.Castle.Core
2.Castle.DynamicProxy2
3.NHibernate.ByteCode.Castle.dll
然后創建如下配置文件:
hibernate.cfg.xml
1: hibernate-configuration xmlns ="urn:nhibernate-configuration-2.2" >
<!--CRLF-->
2: session-factory >
<!--CRLF-->
3: property name ="connection.driver_class" > NHibernate.Driver.SqlClientDriver property >
<!--CRLF-->
4: property name ="connection.connection_string" > server=./SQLExpress;database=NHibernate101;Integrated Security=true; property >
<!--CRLF-->
5: property name ="show_sql" > true property >
<!--CRLF-->
6: property name ="dialect" > NHibernate.Dialect.MsSql2008Dialect property >
<!--CRLF-->
7: property name ="cache.use_query_cache" > false property >
<!--CRLF-->
8: property name ="adonet.batch_size" > 100 property >
<!--CRLF-->
9: property name ="proxyfactory.factory_class" > NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle property >
<!--CRLF-->
10: mapping assembly ="Infrastructure" />
<!--CRLF-->
11: session-factory >
<!--CRLF-->
12: hibernate-configuration >
<!--CRLF-->
十,測試
現在我們去測試我們的Nhibernate配置,通過測試我們添加一些數據到我們的"Categories"表,那么首先要引用Nbibernate程序集以及拷貝hibernate.cfg.xml到我們的測試項目下,添加如下引用:
1.Castle.Core
2.Castle.DynamicProxy2
3.Infrastructure
4.NHibernate
5.NHibernate.ByteCode.Castle
添加如下測試方法:
1: [TestMethod]
<!--CRLF-->
2: [DeploymentItem( "hibernate.cfg.xml" )]
<!--CRLF-->
3: public void CanCreateCategory()
<!--CRLF-->
4: {
<!--CRLF-->
5: IRepository<category> repo = <span style="color: #0000ff">new</span> CategoryRepository();</category>
<!--CRLF-->
6: Category category = new Category();
<!--CRLF-->
7: category.Name = "ASP.NET" ;
<!--CRLF-->
8:
<!--CRLF-->
9: repo.Save(category);
<!--CRLF-->
10:
<!--CRLF-->
11: }
<!--CRLF-->
運行我們的測試方法,我們將看到測試方法成功通過:
核查我們的數據庫,查看category是否已經添加:
隨下的文章中我們將繼續探索!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
