學習和使用Nhibernate已經很久了,一直想寫點東西和大家一起學習使用Nhibernate。部落格園裡也有很多大牛寫了很多關于Nhibernate入門的文章。其中:李永京的部落格http://www.cnblogs.com/lyj/tag/NHibernate/ 内容最為豐富。而且在李哥的部落格裡面學了很多東西,在此緻謝!
本篇文章閱讀對象是:Nhibernate初學者!如果你是Nhibernate的研究者或者已經很熟練的運用Nhibernate請不吝賜教,對本文不足之處進行指教。
帶着問題去學習!學完這些後,希望你能回答下面幾個問題:
1、Nhibernate是什麼?
2、Nhibernate能做什麼?帶給我們的什麼?
3、怎麼搭建Nhibernate?
4、怎麼使用Nhibernate?
好,我們就帶着這幾個問題開始我們的Nhibernate的旅程。
第一個問題:
要明白Nhibernate是什麼,就要首先明白什麼是ORM。
先看一張經典的圖:
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 沒有層次,沒有優化,隻是作為入門的一個簡單介紹!
第一步:設計資料庫中的表。建立一個User表。代碼如下:
代碼
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類。 代碼如下:
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
public string Email
/// 聯系電話
public string Phone
/// 身份證
public string IdentifyId
/// 最後一次登入時間
public DateTime LastTimeLogOn
第三步:建立User類的映射檔案 命名規則:User.hbm.xml 代碼如下:
<?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 代碼如下:
<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 代碼檔案中添加如下代碼
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能做的更多!而且代碼會更加優美!