通俗易懂的Nhibernate教程(1) ----- 基本操作,映射,CURD


網站架構:

1.圖片

image_thumb3

2.說明

Data  -----------------------   類庫項目,數據訪問層,由Nhibernate提供數據相關操作

Mapping -------------------    類庫項目,映射文件都在這個項目中

Model   --------------------    類型項目,實體層

XShop  --------------------     Mvc項目,UI層

 

步驟:

1.安裝Nhibernate

2.配置Nhibernate

3.創建實體類

4.編寫映射文件

5.創建數據庫/表

6.CURD操作

7.測試

 

 

第一步:安裝Nhibernate,這一步就不用說了,使用Nuget安裝,看圖

 

image_thumb11

 

 

第二步:配置Nhibernate

2.1 這一步主要是一些系統級的配置,如:連接字符串,數據庫驅動,數據庫方言等

2.2 創建 hibernate.cfg.xml文件(XShop項目中)

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <!--Nhibernate對數據庫操作是基於ISession(會話),可以理解為SqlConnection的封裝,可通過SessionFactory創建-->
  <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是一個支持多個數據庫的Orm框架,然而幾乎每個數據庫產品都對Sql的實現都有所不同-->
    <!--Nhibernate通過dialect(方言)消除數據庫之間的差異-->
    <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
    
    <!--是否在調試的時候打印Sql語句-->
    <property name="show_sql">true</property>
    
    <!--映射文件所在的程序集-->
    <mapping assembly="Mapping"/>
  </session-factory>
</hibernate-configuration>

溫馨提示:如果發現在編寫xml文件的時候發現沒有智能提示,請把Nhibernate包的xsd文件復制到Vs安裝目錄中(參考百度)

注意:Nhibernate配置文件的文件名必須為 hibernate.cfg.xml ,不可隨意更改

 

第三步:創建實體類 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; }
    }
}

注意:實體類的屬性必須是virtual,否則Nhibernate會報錯.why?因為這樣Nhibernate就可以重寫這些屬性的訪問邏輯,比如 延遲加載..

 

第四步:創建 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="實體類所在的程序集" auto-import="是否自動導入命名空間,如果否,下面類名應該寫類的全名"
  default-cascade="默認的級聯操作" default-lazy="是否延遲加載" namespace="實體類所在的命名空間">-->
  
  <!--<class name="類型名/類型全名" table="對應的表名" >-->
  <class name="Customer" table="Customer" >
    
    <!--id是必須的-->
    <!--<id name="Id的屬性名" column="列名" type="數據類型" unsaved-value="未被持久化到數據庫時,id的值" generator="id的生成策略"></id>-->
    <id name="Id" column="CustomerId" type="int" unsaved-value="0" generator="native"></id>
    
    <!--<property name="屬性名" column="對應的列名" length="長度" type="數據類型" 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.映射文件命名規則:  類名.hbm.xml  ,不可隨意更改

2.映射文件的生成策略必須為:嵌入到程序集

 

第五步:創建數據庫和表

5.1 創建數據庫

CREATE DATABASE XShopDb
GO

 

5.2  創建表

   5.2.1創建表的兩種方式--手動創建

    注意:創建的表結構應該與映射文件一樣

    5.2.1創建表的兩種方式--使用SchemaExport生成的Sql

    代碼:可以創建一個控制台項目或Winform項目跑下面這段代碼

NHibernate.Cfg.Configuration configuration = new NHibernate.Cfg.Configuration().Configure();
NHibernate.Tool.hbm2ddl.SchemaExport schemaExport = new NHibernate.Tool.hbm2ddl.SchemaExport(configuration);
//打印Sql腳本,但不執行
 schemaExport.Create(true, false);

 //導出到文件
//schemaExport.SetOutputFile(@"c:/schma.sql");

       結果:

        image_thumb5

 

 

第六步:CURD操作(Data項目)

6.1 上面我們提過,所有數據庫操作都是通過ISession對象操作,而ISession可以通過ISessionFactory創建

-----創建HbmHelper類--獲取ISessionFactory

namespace Data
{
    public class HbmHelper
    {
        private static ISessionFactory _sessionFactory;
        public static ISessionFactory CurrentSessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                    //創建SessionFactory
                    _sessionFactory = new Configuration().Configure().BuildSessionFactory(); 
                }
                return _sessionFactory;
            }
        }
    }
}

 

-------從ISessionFactory中創建session

private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession();

 

------添加數據訪問基類 BaseDal<T>

namespace Data
{
    /// <summary>
    /// 數據訪問基類
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class BaseDal<T> where T : class
    {
        //從ISessionFactory中創建session
        private ISession _session = HbmHelper.CurrentSessionFactory.OpenSession();

        #region ------------------   CURD    ----------------
        /// <summary>
        /// 添加數據
        /// </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)
        {
            //使用事務
            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
    }
}

 

第七步:添加數據,測試

7.1 添加數據

image_thumb1

7.2 創建單元測試項目,添加測試類:

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.cnblogs.com/files/zhxj/XShop0822.zip

原創文章,轉載請注明出處:http://www.cnblogs.com/zhxj/      

 

 

2015.08.22 --張小軍


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM