天天看點

Nhibernate入門與demo

      學習和使用Nhibernate已經很久了,一直想寫點東西和大家一起學習使用Nhibernate。部落格園裡也有很多大牛寫了很多關于Nhibernate入門的文章。其中:李永京的部落格http://www.cnblogs.com/lyj/tag/NHibernate/  内容最為豐富。而且在李哥的部落格裡面學了很多東西,在此緻謝!

      本篇文章閱讀對象是:Nhibernate初學者!如果你是Nhibernate的研究者或者已經很熟練的運用Nhibernate請不吝賜教,對本文不足之處進行指教。

     帶着問題去學習!學完這些後,希望你能回答下面幾個問題:

     1、Nhibernate是什麼?

     2、Nhibernate能做什麼?帶給我們的什麼?

     3、怎麼搭建Nhibernate?

     4、怎麼使用Nhibernate?

     好,我們就帶着這幾個問題開始我們的Nhibernate的旅程。

    第一個問題:

     要明白Nhibernate是什麼,就要首先明白什麼是ORM。

      先看一張經典的圖:

Nhibernate入門與demo

     ORM:對象關系映射(O/R Mapping,Object Relational Mapping)表示一種技術,用來把對象模型表示的對象映射到基于SQL 的關系模型資料結構中去。通俗講,就是我們操作實體類,然後讓ORM架構自動映射到資料庫中。

     而Nhibernate就是:.Net環境下實作ORM的技術的一個架構!

     第二個問題:

     Nhibernate能做什麼呢?

     看下面代碼:

User myUser = new User();

//User初始化........

session.Save(myUser);//儲存一個使用者

session.Update(myUser);//更新使用者

session.Delete(myUser);//删除使用者

User user = session.Get<User>(Id) as User;//根據主鍵擷取使用者的 使用者執行個體

      session哇!這麼牛,不用寫一句sql   session就幫你把所有的活都幹了!那session設計肯定很難吧?告訴你吧,session是我們隻需要一個配置檔案就可以随處調用了。這麼神奇?

     Nhibernate帶給我們的就是:對于開發者通常的資料持久化相關的程式設計任務,解放其中的95%!

     第三個問題:

     這是本文的關鍵,是怎麼搭建呢?

     先看項目整體圖,作為初學的demo 沒有層次,沒有優化,隻是作為入門的一個簡單介紹!

Nhibernate入門與demo

     第一步:設計資料庫中的表。建立一個User表。代碼如下:    

Nhibernate入門與demo
Nhibernate入門與demo

代碼

CREATE TABLE Hksj_User

(

Id INT IDENTITY(1,1) NOT NULL, --id主鍵

SName NVARCHAR(20) NOT NULL, --使用者名

SNickName NVARCHAR(20), --真實姓名

SPassWord NVARCHAR(30) NOT NULL, --密碼

DCreateDate DATETIME , --建立 日期

SCreator NVARCHAR(20), --建立人

SEmail NVARCHAR(50), --Email

SPhone NVARCHAR(50), --電話

SIdentifyId NVARCHAR(30), --身份證

DLastTimeLogOn DATETIME --上次登入日期

PRIMARY KEY CLUSTERED

Id ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

END

    第二步:設計User類。 代碼如下:

Nhibernate入門與demo
Nhibernate入門與demo

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace MyWeb.WebTemp.Model

{

public class User

/// <summary>

/// 使用者id

/// </summary>

public Int32 Id

get;

set;

}

/// 使用者名,登入所用的名字

public string Name

/// 真實姓名

public string NickName

/// 密碼

public string PassWord

/// 建立日期

public DateTime CreateTime

/// 建立人

public string Creator

/// Email

public string Email

/// 聯系電話

public string Phone

/// 身份證

public string IdentifyId

/// 最後一次登入時間

public DateTime LastTimeLogOn

     第三步:建立User類的映射檔案 命名規則:User.hbm.xml  代碼如下:    

Nhibernate入門與demo
Nhibernate入門與demo

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

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

<class name="MyWeb.WebTemp.Model.User,MyWeb.WebTemp.Model" table="Hksj_User" lazy="false">

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

<generator class="native" />

</id>

<property name="Name" column="SName" type="String" length="20" />

<property name="NickName" column="SNickName" type="String" length="20" />

<property name="PassWord" column="SPassWord" type="String" length="30" />

<property name="IdentifyId" column="SIdentifyId" type="String" length="30" />

<property name="Phone" column="SPhone" type="String" length="50" />

<property name="Email" column="SEmail" type="String" length="50" />

<property name="CreateTime" column="DCreateDate" type="DateTime" />

<property name="Creator" column="SCreator" type="String" length="20" />

<property name="LastTimeLogOn" column="DLastTimeLogOn" type="DateTime" />

</class>

</hibernate-mapping>

     簡單解釋一下:

      1、<property name="Email" column="SEmail" type="String" length="50" />    意思: property name指的是:User類的屬性名字 Email對應資料庫的列SEmail 類型是String,長度50個字元。

     2、<class name="MyWeb.WebTemp.Model.User,MyWeb.WebTemp.Model" table="Hksj_User" lazy="false">

         這個是配置類的全名稱,以及所屬的程式集。然後對應資料庫的表名。設定延遲加載為false。具體可以參考Nhibernate官方文檔。

     3、一定要将這個檔案的屬性:生成操作設定為嵌入資源!

     第四步:建立Nhibernate的配置檔案:hibernate.cfg.xml   代碼如下:    

Nhibernate入門與demo
Nhibernate入門與demo

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

<session-factory>

<!-- properties -->

<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>

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

<property name="connection.connection_string">server=.;uid=sa;pwd=123;database=HkTemp;</property>

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

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

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

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

<!-- 代理工廠,可以試用Castle,也可以試用LinFu -->

<!-- <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>-->

<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>

<!-- mapping files 領域對象映射檔案所在程式集 -->

<mapping assembly="NhibernateDemo"/>

</session-factory>

</hibernate-configuration>

解釋:

1、<!-- mapping files 領域對象映射檔案所在程式集 -->

2、<property name="connection.connection_string">server=.;uid=sa;pwd=123;database=HkTemp;</property>是配置資料庫連接配接字元串。

其他的都是Nhibernate最重要的資料庫provider,sessionfactory等。不詳細說。看官方文檔!

      第四個問題:    

      使用和測試你的配置【可以爽一把了!】

     在Default.aspx   代碼檔案中添加如下代碼

Nhibernate入門與demo
Nhibernate入門與demo

Configuration cfg = new Configuration();

cfg.Configure(Server.MapPath("~") + "Nhibernate.cfg.xml");

ISessionFactory _SessionFactory = cfg.BuildSessionFactory();//建立Session工廠

ISession session = _SessionFactory.OpenSession();//打開Session

MyWeb.WebTemp.Model.User myUser = new User {IdentifyId="122222",Email="22222",CreateTime=DateTime.Now, LastTimeLogOn = DateTime.Now, Name= "ml",NickName="malun",PassWord="123",Phone="nihao" };

session.Save(myUser);

session.Flush();

session.Delete(User);

     檢視資料庫中,有沒有一條資料儲存了?

     Nhibernate做的不隻是這些!搭載Spring.Net  Nhibernate能做的更多!而且代碼會更加優美!