1.搭建基本框架數據庫
1)建立一個空的MVC項目Shop.Web安全
2)建立類庫Shop.Data(數據)session
3)建立類庫Shop.Domain(映射模型model)多線程
4)建立類庫Shop.Business(業務邏輯)app
5)建立數據庫Shop,建立表Cart(字段Id,Name)框架
2.安裝NHibernateide
咱們須要鏈接獲取到數據(使用NHibernate),因此咱們在Shop.Data中右擊引用=》點擊Nuget程序包,查詢NHibernate,安裝(安裝完畢後,引用會多出一些東西,你能夠對比一下其它類庫的引用)ui
3.數據庫鏈接配置(Shop.Data中進行)url
1)尋找項目中的MSSQL.cfg.xml(你能夠右鍵項目在 項目 \Shop.Web\packages\NHibernate.5.2.4\ConfigurationTemplates文件裏頭找到,不一樣的xml支持不一樣的數據庫--裏頭咱們能夠看到其餘數據庫的連接)spa
2)咱們將MSSQL.cfg.xml複製加載到Shop.Web項目裏頭,並更名爲hibernate.cfg.xml,當作數據庫鏈接的配置,修改裏頭hibernate.cfg.xml的內容(右擊hibernate.cfg.xml文件屬性的「高級」修改爲:「若是較新則複製」)
hibernate.cfg.xml
<?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.dll provider for SQL Server --> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > <session-factory name="NHibernate.Test"> <!--定製IDriver的類型.--> <property name="connection.driver_class">NHibernate.Driver.Sql2008ClientDriver</property> <!--鏈接字符串--> <property name="connection.connection_string"> Server=.;database=Shop;uid=sa;pwd=sa </property> <!--NHibernate方言(Dialect)的類名 - 可讓 NHibernate 使用某些特定的數據庫平臺的特性--> <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <!--指定映射文檔中所在程序集--> <mapping assembly="Shop.Domain"/> </session-factory> </hibernate-configuration>
4.Web頁面
1)因爲前面咱們的Shop.Web是一個空項目,添加個Controllers文件夾後,右鍵添加個控制器HomeControllers(程序會自動加載其它配置文件)
5.咱們返回到Shop.Data那邊,準備給它弄個NHibernateHelper.cs(單例加載數據,用於建立ISessionFactory,和配置ISessionFactory,而且打開一個新的ISession方法)
說明:一個ISession表明一個單線程的單元操做。
ISessionFactory是線程安全的,不少線程能夠同時訪問它。
ISession不是線程安全的,表明與數據庫之間的一次操做。
ISession經過ISessionFactory打開,在全部的工做完成以後須要將其關閉。
SessionFactory的建立很佔用系統資源,通常整個應用程序中只建立一次。所以這裏經過 _sessionFactory == null 來實現一個最簡單的單例模式。
using NHibernate; using NHibernate.Cfg; namespace Shop.Data { public class NHibernateHelper { private static ISessionFactory _sessionFactory; /// <summary> /// 建立ISessionFactory /// </summary> public static ISessionFactory SessionFactory { get { //配置ISessionFactory return _sessionFactory == null ? (new Configuration()).Configure().BuildSessionFactory():_sessionFactory; } } } }
6.持久化類,建立映射模型Cart.cs(在Shop.Domain中建立一個Entities文件夾,在Entities中添加類Cart)
namespace Shop.Domain.Entities { public class Cart { public virtual int Id { get; set; } public virtual string Name { get; set; } } }
注:NHibernate默認使用代理功能,要求持久化類不是sealed,而且其公共方法、屬性和事件聲明爲virtual。
7.編寫持久化映射文件
1)在Shop.Domain中建立映射文件Cart.hbm.xml
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Shop.Domain" namespace="Shop.Domain.Entities"> <!--類的全稱,程序集,數據庫表名稱--> <class name="Shop.Domain.Entities.Cart,Shop.Domain" table="Cart"> <id name="Id" column="Id" type="int" /> <property name="Name" column="Name" type="string" /> </class> </hibernate-mapping>
2)修改Cart.hbm.xml屬性配置(「生成操做」:「嵌入的資源」)
8.添加數據訪問層類CartData.cs(在Shop.Data中添加,而且引用項目Shop.Domain)
說明:使用using子句,在using代碼塊完成後,自動調用ISession的Dispose方法關閉Session。
using NHibernate; using Shop.Domain.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; namespace Shop.Data { public class CartData { /// <summary> /// 根據條件獲得數據集合 /// </summary> /// <param name="where"></param> /// <returns></returns> public IList<Cart> GetCartList(Expression<Func<Cart,bool>> where) { try { using (ISession session = NHibernateHelper.SessionFactory.OpenSession()) { return session.Query<Cart>().Select(x=>new Cart { Id = x.Id, Name = x.Name }).Where(where).ToList(); } } catch (Exception ex) { throw ex; } } } }
9.添加業務邏輯CartBusiness.cs(在Shop.Business中添加,而且引用項目Shop.Domain和Shop.Data)
using Shop.Data; using Shop.Domain.Entities; using System; using System.Collections.Generic; using System.Linq.Expressions; namespace Shop.Business { public class CartBusiness { private CartData _cartData; public CartBusiness() { _cartData = new CartData(); } /// <summary> /// 根據條件獲得數據集合 /// </summary> /// <param name="where"></param> /// <returns></returns> public IList<Cart> GetCartList(Expression<Func<Cart, bool>> where) { return _cartData.GetCartList(where); } } }
10.添加視圖和控制器(咱們在前面建立的HomeCotrollers,引用項目Shop.Domain和Shop.Business)
1)在HomeController.cs添加代碼
using Shop.Business; using System.Web.Mvc; namespace Shop.Web.Controllers { public class HomeController : Controller { CartBusiness _cartBusiness = new CartBusiness(); // GET: Home public ActionResult Index() { var result = _cartBusiness.GetCartList(c=>1 == 1); return View(result); } } }
2)右鍵控制器Index添加視圖
所有從新生成後,選擇Shop.Web爲啓動項,運行出現 Antlr3.Runtime 版本不對
經查詢: Shop.Web 的引用 存在 Antlr3.Runtime,而且版本和Shop.Data的不一致。(Antlr3.Runtime是安裝NHibernate包裏頭的一個dll)
解決:Shop.Web項目Nuget安裝 NHibernate
從新生成運行:
參閱:ASP.NET MVC 企業級實戰(鄒瓊俊)