NHibernate總結


現在的項目中數據訪問使用的是NHibernate的一個ORM框架,小弟也是在后期加入項目組,之前對NHibernate就一直沒有接觸過,所以一直在學習NHibernate,都是一些很基礎的一些東西,寫出來總結一下,作為備忘。

如果你下個系統的學習NHibernate,給大家推薦一個博客,詳細的介紹了NHibernate,我也是根據這篇博客學習的。請點擊(http://www.cnblogs.com/lyj/archive/2008/10/10/1308267.html)

NHibernate是什么

NHibernate 是一個面向.NET 環境的對象/關系數據庫映射工具。對象關系映射(O/R Mapping,Object Relational Mapping)表示一種技術,用來把對象模型表示的對象映射到基於SQL 的關系模型數據結構中去。

NHibernate不僅僅管理.NET 類到數據庫表的映射(包括.NET 數據類型到SQL 數據類型的映射),還提供數據查詢和獲取數據的方法,大幅度減少我們開發時人工使用SQL和ADO.NET處理數據的時間。NHibernate的目標是對於開發者通常的數據持久化相關的編程任務,解放其中的95%。並請記住NHibernate作為數據庫訪問層,是與你的程序緊密集成的。

開始使用NHibernate

我們親自動手,一步一步實現一個NHibernate簡單程序來,我只實現了簡單的增刪改查功能。我使用的開發環境:Microsoft Visual Studio 2012、SQL Server 2008 、NHibernate。

1、創建項目

(1)     我們新建如下一個項目

 

NH.Data層為Nhibernate操作相關,其中DBConnect.cfg.xml文件為數據庫連接文件(按照模板修改即可),NHData.cs包含增刪改查操作,NHibernateHelper.cs封裝Nhibernate底層操作,People.cs為實體類,People.hbm.xml為映射文件(把數據庫表People映射到實體類People)。,其中People實體類中的字段要設置為virtual。每個文件的詳細代碼在下面介紹

(2)     在NH.Data層引用Nhibernate相關的DLL

 

2、建立數據庫表

Create database Test
GO
use Test
GO
 CREATE TABLE [dbo].[People](

[Id] [int] IDENTITY(1,1) primary key NOT NULL,

[Name] [nvarchar](10) NULL,

[Age] [int] NULL,

[Sex] [nvarchar](1) NULL,
 
)

GO

 3、NH.Data類庫中文件介紹

(1)      DBConnect.cfg.xml數據庫連接文件

我們根據模板修改一下配置信息和文件輸出屬性就可以了,主要就是配置連接字符串。

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >

  <session-factory>

    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

    <property name="connection.connection_string">

      Server=10.165.150.105;initial catalog=Test;User ID=sa;Password=Hello123

    </property>

    <property name="adonet.batch_size">25</property>

    <property name="show_sql">true</property>

    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>

    <property name="use_outer_join">true</property>

    <property name="command_timeout">60</property>

    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>

    <property name="proxyfactory.factory_class">

      NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu

    </property>

    <mapping assembly="NH.Data"/>

  </session-factory>

</hibernate-configuration>

 注意:XML文件的默認“復制到輸出目錄”為“不復制”,這里需要修改為“始終復制”。否則出現異常。我們可以在該文件上點擊右鍵選擇屬性進行修改。

(2)     NHibernateHelper.cs數據操作輔助類

我們現在可以開始NHibernate了。首先,我們要從ISessionFactory中獲取一個ISession(NHibernate的工作單元)。ISessionFactory可以創建並打開新的Session。一個Session代表一個單線程的單元操作。 ISessionFactory是線程安全的,很多線程可以同時訪問它。ISession不是線程安全的,它代表與數據庫之間的一次操作。ISession通過ISessionFactory打開,在所有的工作完成后,需要關閉。 ISessionFactory通常是個線程安全的全局對象,只需要被實例化一次。我們可以使用GoF23中的單例(Singleton)模式在程序中創建ISessionFactory。這個實例我編寫了一個輔助類NHibernateHelper 用於創建ISessionFactory並配置ISessionFactory和打開一個新的Session單線程的方法,之后在每個數據操作類可以使用這個輔助類創建ISession

public class NHibernateHelper

    {

        private ISessionFactory _sessionFactory;

        public NHibernateHelper()

        {

            _sessionFactory = GetSessionFactory();

        }

        private ISessionFactory GetSessionFactory()

        {

            return (new Configuration()).Configure(AppDomain.CurrentDomain.BaseDirectory + "DBConnect.cfg.xml").BuildSessionFactory();

        }

        public ISession GetSession()

        {

            return _sessionFactory.OpenSession();

        }

      

}

(3)     People.cs實體類

public class People

    {

       public virtual int Id { get; set; }

       public virtual string Name { get; set; }

       public virtual int Age { get; set; }

       public virtual string Sex { get; set; }

}

 注意:字段的屬性一定要設置為virtual,要不然會報錯

(4)     下面我們開始為People實體類進行數據庫表映射配置People.hbm.xml

NHibernate要知道怎樣去加載和存儲持久化類的對象。這正是NHibernate映射文件發揮作用的地方。映射文件包含了對象/關系映射所需的元數據。元數據包含持久化類的聲明和屬性到數據庫的映射。映射文件告訴NHibernate它應該訪問數據庫里面的哪個表及使用表里面的哪些字段。

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"

   assembly="NH.Data"

   namespace="NH.Data">

 

  <class name ="People" table="People" lazy="true">

    <id name="Id" column ="Id" type="Int32">

      <generator class ="native"/>

    </id>

    <property name ="Name" column="Name" type="String"/>

    <property name ="Age" type="Int32" column="Age"/>

    <property name ="Sex" type="String" column="Sex"/>

  </class>

</hibernate-mapping>

 注意:XML文件的默認生成操作為“內容”,這里需要修改為“嵌入的資源”生成,因為NHibernate是通過查找程序集中的資源文件映射實體。我們可以在People.hbm.xml點擊右鍵選擇屬性修改該文件的生成操作

(5)     NHData.cs對庫表People進行增刪改查

現在完事具備只欠東風了,開始我們的數據庫CRUD操作,在看該文件的代碼時,建議大家先看一下http://www.cnblogs.com/lyj/archive/2008/10/15/1312089.html這篇博客,了解一下NHibernate查詢語言(HQL)。

public class NHData

    {

       protected ISession Session { get; set; }

       public NHData()

        {

            Session = new NHibernateHelper().GetSession();

        }

       public IList<People> GetList()

       {

           var crit = Session.CreateCriteria(typeof(People));

           return crit.List<People>();

       }

       //增加

       public int Create(People p)

       {

         object value= Session.Save(p);

           Session.Flush();

           return Convert.ToInt32(value);

       }

       //根據Sql語句獲取實體

       public IList<People> GetListBySql()

       {

           return Session.CreateQuery("from People c where c.id>:id").SetString("id", "1").List<People>();

 

           string strsql = "select * from Customer where id>2";

           ISQLQuery sqlQuery = Session.CreateSQLQuery(strsql).AddEntity("Customer", typeof(People));

           return sqlQuery.List<People>();

       }

       //獲取

       public People Get(int id)

       {

           List<ICriterion> lst = new List<ICriterion>();

           lst.Add(Restrictions.Where<People>(c=>c.Id==id));

           var crit = Session.CreateCriteria(typeof(People));

           lst.ForEach(c => crit.Add(c));

           return crit.List<People>()[0];

       }

       //刪除

       public void Delete(int id)

       {

           People p = Get(id);

           Session.Delete(p);

           Session.Flush();

       }

       //修改

       public void Update(int id)

       {

           People p=Get(id);

           p.Name="wer";

           Session.Update(p);

           Session.Flush();

       }

 

       public List<People> getList()

       {

           string strsql = "select * from people";

           SqlConnection con = new SqlConnection(strsql);

           con.Open();

           SqlCommand cmd = new SqlCommand(strsql,con);

           SqlDataAdapter sda = new SqlDataAdapter(cmd);

           DataTable dt = new DataTable();

           sda.Fill(dt);

           return dt.ToList<People>();

       }

 

}

4、測試

在NHibernateSample中引用NH.Data.dll

把NH.Data中的DBConnect.cfg.xml文件copy到NHibernateSample項目中,這個問題我一直沒有解決,不知道怎么解決。

新建一個default.aspx頁面

protected void btnAdd_click(object sender, EventArgs e)

        {

            People p = new People()

            {

                Name = new Random().Next(99999999).ToString(),

                Age = 10010,

                Sex = ""

            };

            data.Create(p);

            IList<People> lst = data.GetList();

            GridView1.DataSource = lst;

            GridView1.DataBind();

        }

點擊這里下載源程序

 每天學習一點點,每天進步一點點。


免責聲明!

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



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