網(wǎng)站架構(gòu):
1.圖片
2.說明
Data ----------------------- 類庫項目,數(shù)據(jù)訪問層,由Nhibernate提供數(shù)據(jù)相關(guān)操作
Mapping ------------------- 類庫項目,映射文件都在這個項目中
Model -------------------- 類型項目,實(shí)體層
XShop -------------------- Mvc項目,UI層
步驟:
1.安裝Nhibernate
2.配置Nhibernate
3.創(chuàng)建實(shí)體類
4.編寫映射文件
5.創(chuàng)建數(shù)據(jù)庫/表
6.CURD操作
7.測試
第一步:安裝Nhibernate,這一步就不用說了,使用Nuget安裝,看圖
第二步:配置Nhibernate
2.1 這一步主要是一些系統(tǒng)級的配置,如:連接字符串,數(shù)據(jù)庫驅(qū)動,數(shù)據(jù)庫方言等
2.2 創(chuàng)建 hibernate.cfg.xml文件(XShop項目中)
<?xml version="1.0" encoding="utf-8" ?><hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> <!--Nhibernate對數(shù)據(jù)庫操作是基于Isession(會話),可以理解為SqlConnection的封裝,可通過SessionFactory創(chuàng)建--> <session-factory name="XShop"> <!--連接提供程序--> <PRoperty name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> <!--連接字符串--> <property name="connection.connection_string"> Server=.;initial catalog=XShopDb;Integrated Security=SSPI </property> <!--Nhibernate是一個支持多個數(shù)據(jù)庫的Orm框架,然而幾乎每個數(shù)據(jù)庫產(chǎn)品都對Sql的實(shí)現(xiàn)都有所不同--> <!--Nhibernate通過dialect(方言)消除數(shù)據(jù)庫之間的差異--> <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> <!--是否在調(diào)試的時候打印Sql語句--> <property name="show_sql">true</property> <!--映射文件所在的程序集--> <mapping assembly="Mapping"/> </session-factory></hibernate-configuration>
溫馨提示:如果發(fā)現(xiàn)在編寫xml文件的時候發(fā)現(xiàn)沒有智能提示,請把Nhibernate包的xsd文件復(fù)制到Vs安裝目錄中(參考百度)
注意:Nhibernate配置文件的文件名必須為 hibernate.cfg.xml ,不可隨意更改
第三步:創(chuàng)建實(shí)體類 Customer(Model項目)
3.1 代碼
namespace Model{ public class Customer { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual string UserName { get; set; } public virtual string PassWord { get; set; } public virtual DateTime CreateTime { get; set; } }}注意:實(shí)體類的屬性必須是virtual,否則Nhibernate會報錯.why?因?yàn)檫@樣Nhibernate就可以重寫這些屬性的訪問邏輯,比如 延遲加載..
第四步:創(chuàng)建 Customer.hbm.xml 映射文件(Mapping項目)
4.1 代碼:
<?xml version="1.0" encoding="utf-8" ?><hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" auto-import="true" default-cascade="all" default-lazy="true" namespace="Model"> <!--<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="實(shí)體類所在的程序集" auto-import="是否自動導(dǎo)入命名空間,如果否,下面類名應(yīng)該寫類的全名" default-cascade="默認(rèn)的級聯(lián)操作" default-lazy="是否延遲加載" namespace="實(shí)體類所在的命名空間">--> <!--<class name="類型名/類型全名" table="對應(yīng)的表名" >--> <class name="Customer" table="Customer" > <!--id是必須的--> <!--<id name="Id的屬性名" column="列名" type="數(shù)據(jù)類型" unsaved-value="未被持久化到數(shù)據(jù)庫時,id的值" generator="id的生成策略"></id>--> <id name="Id" column="CustomerId" type="int" unsaved-value="0" generator="native"></id> <!--<property name="屬性名" column="對應(yīng)的列名" length="長度" type="數(shù)據(jù)類型" not-null="是否不可空"></property>--> <property name="Name" column="Name" length="20" type="string" not-null="true"></property> <property name="UserName"> <column name="UserName" sql-type="nvarchar" not-null="true" length="20"></column> </property> <property name="Password" length="32" column="Password" not-null="true" type="string"></property> <property name="CreateTime" column="CreateTime" type="datetime" not-null="true"></property> </class></hibernate-mapping>
注意:
1.映射文件命名規(guī)則: 類名.hbm.xml ,不可隨意更改
2.映射文件的生成策略必須為:嵌入到程序集
第五步:創(chuàng)建數(shù)據(jù)庫和表
5.1 創(chuàng)建數(shù)據(jù)庫
CREATE DATABASE XShopDbGO
5.2 創(chuàng)建表
5.2.1創(chuàng)建表的兩種方式--手動創(chuàng)建
注意:創(chuàng)建的表結(jié)構(gòu)應(yīng)該與映射文件一樣
5.2.1創(chuàng)建表的兩種方式--使用SchemaExport生成的Sql
代碼:可以創(chuàng)建一個控制臺項目或Winform項目跑下面這段代碼
NHibernate.Cfg.Configuration configuration = new NHibernate.Cfg.Configuration().Configure();NHibernate.Tool.hbm2ddl.SchemaExport schemaExport = new NHibernate.Tool.hbm2ddl.SchemaExport(configuration);//打印Sql腳本,但不執(zhí)行 schemaExport.Create(true, false); //導(dǎo)出到文件//schemaExport.SetOutputFile(@"c:/schma.sql");結(jié)果:
第六步:CURD操作(Data項目)
6.1 上面我們提過,所有數(shù)據(jù)庫操作都是通過ISession對象操作,而ISession可以通過ISessionFactory創(chuàng)建
-----創(chuàng)建HbmHelper類--獲取ISessionFactory
namespace Data{ public class HbmHelper { private static ISessionFactory _sessionFactory; public static ISessionFactory CurrentSessionFactory { get { if (_sessionFactory == null) { //創(chuàng)建SessionFactory _sessionFactory = new Configuration().Configure().BuildSessionFactory(); } return _sessionFactory; } } }}
-------從ISessionFactory中創(chuàng)建session
private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession();
------添加數(shù)據(jù)訪問基類 BaseDal<T>
namespace Data{ /// <summary> /// 數(shù)據(jù)訪問基類 /// </summary> /// <typeparam name="T"></typeparam> public class BaseDal<T> where T : class { //從ISessionFactory中創(chuàng)建session private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession(); #region ------------------ CURD ---------------- /// <summary> /// 添加數(shù)據(jù) /// </summary> /// <param name="model"></param> public int Insert(T model) { int id=(int) _session.Save(model); _session.Flush(); return id; } /// <summary> /// 更新 /// </summary> /// <param name="model"></param> public void Update(T model) { //使用事務(wù) using (ITransaction ts = _session.BeginTransaction()) { try { _session.Update(model); _session.Flush(); ts.Commit(); } catch (Exception) { ts.Rollback(); throw; } } } /// <summary> /// 刪除 /// </summary> /// <param name="model"></param> public void Delete(T model) { _session.Delete(model); _session.Flush(); } /// <summary> /// 查詢 /// </summary> /// <param name="id"></param> /// <returns></returns> public T Query(int id) { return _session.Get<T>(id); } #endregion }}
第七步:添加數(shù)據(jù),測試
7.1 添加數(shù)據(jù)
7.2 創(chuàng)建單元測試項目,添加測試類:
namespace DataTest{ [TestClass] public class BaseDalTest { private BaseDal<Customer> _customerDal = new BaseDal<Customer>(); [TestMethod] public void GetTest() { var result = _customerDal.Query(1); Assert.AreEqual(result.Name, "張小軍"); } [TestMethod] public void InsertTest() { Customer customer = new Customer() { Name = "張三", Password = "654321", UserName = "zhs" }; int id = _customerDal.Insert(customer); var result = _customerDal.Query(id); Assert.AreEqual(customer.UserName, result.UserName); } [TestMethod] public void UpdateTest() { var result = _customerDal.Query(1); result.Name = "王五"; _customerDal.Update(result); var r2 = _customerDal.Query(1); Assert.AreEqual(result.Name,r2.Name); } [TestMethod] public void DelTest() { var result = _customerDal.Query(1); _customerDal.Delete(result); var r2 = _customerDal.Query(1); Assert.IsNotNull(r2); } }}
代碼:http://files.VEVb.com/files/zhxj/XShop0822.zip
原創(chuàng)文章,轉(zhuǎn)載請注明出處:http://www.survivalescaperooms.com/zhxj/
2015.08.22 --張小軍
新聞熱點(diǎn)
疑難解答