<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    風人園

    弱水三千,只取一瓢,便能解渴;佛法無邊,奉行一法,便能得益。
    隨筆 - 99, 文章 - 181, 評論 - 56, 引用 - 0
    數據加載中……

    NHibernate快速指南(ZT)

    NHibernate 是一個基于.Net 的針對關系型數據庫的對象持久化類庫。Nhibernate 來源于非常優秀的基于Java的Hibernate 關系型持久化工具。

    NHibernate 從數據庫底層來持久化你的.Net 對象到關系型數據庫。NHibernate 為你處理這些,遠勝于你不得不寫SQL去從數據庫存取對象。你的代碼僅僅和對象關聯,NHibernat 自動產生SQL語句,并確保對象提交到正確的表和字段中去。



    為什么寫這個指南



    任何熟悉Hibernate的人會發現這篇指南和Glen Smith 的 A Hitchhiker's Guide to Hibernate 非常相近。這里的內容正是基于他的指南,因此所有的感謝都應該給與他。

    NHibernate的文檔并非每處都和Hibernate的文檔一致。然而,項目的相似應該能使讀者通過讀Hibernate的文檔來很好的理解NHibernate如何工作。

    這篇文檔意在讓你盡可能快的開始使用NHibernate。它將介紹如何持久化一個簡單的對象到一張表里。想得到更多的復雜的例子,可以參考NUnit測試及附帶代碼。



    開發的過程



    Nhibernate未來將會提供一些工具幫助你自動產生schema文件(現在還是基于代碼)或是通過映射文件產生類(在籌措階段)或是更新schema(來自于一個新開發者的建議)。然而,這里我們的例子是假定一切來自于完全手寫,包括設置表和.Net類的編寫。我們將進行以下步驟。

    1.新建一個將要持久化.Net對象的表

    2.構建一個需要被持久化的.Net類

    3.構建一個可以讓NHibernate知道如何持久化對象屬性的映射文件

    4.構建一個讓NHibernate知道如何連接數據庫的配置文件]

    5.使用NHibernate的API



    第一步:寫構建表的SQL



    這里我們將使用的是一個非常簡單的例子。假設你正在為你的網站開發一個基本的用戶管理子系統。我們將使用如下的一張User表(假定你已經設置好一個數據庫—在的例子里我稱它為NHibernate)。






    use NHibernate
    go

    CREATE TABLE users (
    LogonID nvarchar(20) NOT NULL default '0',
    Name nvarchar(40) default NULL,
    Password nvarchar(20) default NULL,
    EmailAddress nvarchar(40) default NULL,
    LastLogon datetime default NULL,
    PRIMARY KEY (LogonID)
    )
    go
    我使用的是MS Sql Server 2000, 但也可以使用任何數據庫,只要你有關于它們的基于.Net數據提供驅動程序。我們將得到一個含有LogonID,Name, Password, Email 和LastLogon的表. 經過以上標準步驟,我們下一步是寫一個.Net類處理一個給定的User對象。

    第二步:產生一個.Net 類文件



    當內存中有一堆User對象的時候,我們需要某種對象去保存它們。NHibernate通過對象屬性的反射來工作,因此我們需要添加我們希望持久化的對象屬性。一個可以被NHibernate持久化的類應該看起來象下面的樣子:


    using System;

    namespace NHibernate.Demo.QuickStart
    {
    public class User
    {
    private string id;
    private string userName;
    private string password;
    private string emailAddress;
    private DateTime lastLogon;


    public User()
    {
    }

    public string Id
    {
    get { return id; }
    set { id = value; }
    }

    public string UserName
    {
    get { return userName; }
    set { userName = value; }
    }

    public string Password
    {
    get { return password; }
    set { password = value; }
    }

    public string EmailAddress
    {
    get { return emailAddress; }
    set { emailAddress = value; }
    }

    public DateTime LastLogon
    {
    get { return lastLogon; }
    set { lastLogon = value; }
    }

    }
    }
    在上面的例子里,我們的屬性和構建函數 是public,但這個對NHibernate不是必要的.它可以使用public, protected, internal或者甚至是用private來持久化數據。



    第三步:寫映射文件

    現在我們有數據表和需要去映射它的.Net類。我們需要一種方式去讓NHibernate知道如何從一個映射到另一個。這個任務依賴于映射文件來完成。最易于管理的辦法是為每一個類寫一個映射文件,如果你命名它是YourObject.hbm.xml 并且把它放在和類的同一個目錄里,NHiberante將會使得事情簡單起來。下面是一個User.hbm.xml的例子:


    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
    <class name="NHibernate.Examples.QuickStart.User, NHibernate.Examples" table="users">
    <id name="Id" column="LogonId" type="String" length="20">
    <generator class="assigned" />
    </id>
    <property name="UserName" column= "Name" type="String" length="40"/>
    <property name="Password" type="String" length="20"/>
    <property name="EmailAddress" type="String" length="40"/>
    <property name="LastLogon" type="DateTime"/>
    </class>

    </hibernate-mapping>

    讓我們來看看這個文件中讓我們感興趣的某些行。第一個有趣的標簽是class。這里我們將映射類型名稱(類名和裝配件)到我們數據庫中的User表,這里和Hibernate有一點點的不同。你將不得不告訴NHibernate從何處提取對象。在這個例子里我們從裝配件NHibernate.Examples裝載類NHibernate.Examples.QuickStart.User 。NHibernate 遵循和.Net Framework同樣的規則來加載類型。因此如果你在如何指定類型的方面有些混淆,請參看.Net Framework SDK。

    讓我們先跳過id標簽,來討論property標簽。簡要看一下,你將發現NHibernate所要做的工作。name屬性的值正是我們.Net 類的屬性,column屬性值將是我們數據庫里的字段。type屬性是可選的(如果你不標明,NHibernate將利用反射進行最佳的推測)。

    好了,讓我們回到標簽id, 你可以猜測到這個標簽將是映射數據庫表的主鍵,的確如此,id標簽的組成和我們剛才看的property標簽是相似的。我們映射屬性到目標數據庫的字段。

    內嵌的generator 標簽告訴NHibernate 如何生成主鍵(它將恰當的為你生成主鍵,不管你指定何種類型,但你必須告訴它)。在我們的例子里,我們設定為assigned,意味著我們對象將自己生成主鍵(畢竟User對象常常需要一個UserID)。如果你執意要NHiberante為你生成主鍵,你感興趣于設定uuid.hex和uuid.string(從文檔中獲取更多信息)



    提示:如果你使用Visual Studio.Net 去編譯的話,請將user.hbm.xml的Build Action屬性設置為Embedded Resource。映射文件將成為裝配件的一部分。更詳細的細節重點將在后面展示。

    提示:如果你僅僅是改變映射文件,你不能使用build 而應該Rebuild項目。Visual Studio.Net 不會重新編譯有改變的映射文件。



    第四步:為你的數據庫產生一個配置文件

    我們至今還沒有告訴NHibernate 去哪里連接數據庫。最直接的辦法是在你的應用程序的配置文件里設置一個NHibernate配置節。這和在Hibernate里使用屬性文件是等價的。如下配置:


    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    <configSections>
    <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </configSections>

    <nhibernate>
    <add
    key="hibernate.connection.provider"
    value="NHibernate.Connection.DriverConnectionProvider"
    />
    <add
    key="hibernate.dialect"
    value="NHibernate.Dialect.MsSql2000Dialect"
    />
    <add
    key="hibernate.connection.driver_class"
    value="NHibernate.Driver.SqlClientDriver"
    />
    <add
    key="hibernate.connection.connection_string"
    value="Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI"
    />
    </nhibernate>
    </configuration>

    上面的例子里用了SqlClient 驅動,在本地連接名稱為NHibernate 的數據庫,提供用戶名和密碼。那里有一堆屬性你需要調整來確定如何讓NHibernate來訪問數據庫。再次說明,你可以在文檔里獲取更多信息。

    請注意以上的配置里并沒有涉及到log4net的配置信息。NHibernate使用log4net來記錄內部發生的一切。在一個應用程序產品里,在你特定環境里,我推薦配置log4net,并為NHibernate設置一定的日志級別。

    第五步:開始展現NHibernate的魔力



    所有艱苦的工作已經完成。你將有以下內容

    User.cs ----你需要持久化的C#類

    User.hbm.xml ----你的NHibernate映射文件

    App.config ---對ADO.NET連接的配置信息(如果你愿意,你可以在代碼中實現)。

    你的數據庫里有一張User表。



    現在可以在你的代碼中恰當簡潔的使用NHibernate。簡化的版本如下

    創建一個Configuration對象
    讓Configuration知道你將存儲何種類型的對象
    為你選擇的數據庫創建一個Session對象
    Load,Save和Query你的對象
    通過Session的Flush()方法將對象提交給數據庫。


    為了讓你更清晰,我們來看一些代碼。

    首先,創建一個Configuration對象

    Configuration對象能夠解析所有.Net對象和后臺數據庫中的映射關系。




    Configuration cfg = new Configuration();
    cfg.AddAssembly("NHibernate.Examples");

    Configuration對象會搜索裝配件里的任何以hbm.xml 結尾的文件。還有其他方法加載映射文件,但這種方式是最簡單的。

    下一步,創建一個Session對象

    ISession對象提供一個到后臺數據庫的連接,ITransaction對象提供一個可以被NHibernate管理的事務。




    ISessionFactory factory = cfg.BuildSessionFactory();
    ISession session = factory.OpenSession();
    ITransaction transaction = session.BeginTransaction();



    接著來Load, Save和Query你的對象

    現在你可以用使用傳統的.Net方法來操縱對象。你想保存一個新對象到數據庫嗎?嘗試下面的方法:


    User newUser = new User();
    newUser.Id = "joe_cool";
    newUser.UserName = "Joseph Cool";
    newUser.Password = "abc123";
    newUser.EmailAddress = "joe@cool.com";
    newUser.LastLogon = DateTime.Now;

    // Tell NHibernate that this object should be saved
    session.Save(newUser);

    // commit all of the changes to the DB and close the ISession
    transaction.Commit();
    session.Close();


    正如你所看到的,關于NHiberante重要的事情是如此簡單。繼續并且查詢你的數據庫,驗證一下User表里的新記錄。現在重要的事情就是你去操心業務對象并在進行處理的時候告訴NHibernate就可以了。



    讓我們來告訴你,當你有一個UserID的時候如何獲取對象(舉例說,登陸你的網站的時候)。僅僅一句話就可以打開Session,傳入key就可以了




    // open another session to retrieve the just inserted user
    session = factory.OpenSession();

    User joeCool = (User)session.Load(typeof(User), "joe_cool");



    你所獲取的User對象還在生存周期內!改變它的屬性,并通過Flush()持久化到數據庫。


    // set Joe Cool's Last Login property
    joeCool.LastLogon = DateTime.Now;

    // flush the changes from the Session to the Database
    session.Flush();





    你所要做的就是通過NHibernate來進行你需要的改變,并調用Session的Flush()方法提交。驗證一下數據庫,查查用戶ID為”joe_cool”的記錄中”LastLogon”的更改。



    還有更好的,你可以以System.Collections.IList的方式來獲取從表中的對象。如下


    IList userList = session.CreateCriteria(typeof(User)).List();
    foreach(User user in userList)
    {
    System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);
    }

    這個查詢將會返回所有表記錄。往往你需要做更多的控制,比如說獲取從March 14, 2004 10:00 PM 以后登陸的用戶,如下:

    IList recentUsers = session.CreateCriteria(typeof(User))
    .Add(Expression.Expression.Gt("LastLogon", new DateTime(2004, 03, 14, 20, 0, 0)))
    .List();

    foreach(User user in recentUsers)
    {
    System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);
    }


    文檔里還有一堆健壯的查詢方式讓你調用,這里僅僅讓你對NHibernate所提供的強有力的工具有一定的了解。

    最后調用Session對象的Close()方法,釋放NHibernate所使用的ADO.Net連接資源


    // tell NHibernate to close this Session
    session.Close();




    更確切地說…



    你已經完成創建對象,持久化并通過條件查詢或鍵值查詢來返回它。相信你已經從中獲得快樂。

    現在你對NHibernate有了大致的了解,如果你能仔細閱讀大量來自Hibernate 2.0.3文檔,你將獲得幫助(NHibernate文檔還在早期階段,現在還僅僅是對Hibernate的拷貝)。



    Enjoy! And Happy NHibernating!

    Mike Doerfler



    再次說明,所有的權利來自Glen Smith的A Hitchhiker's Guide to Hibernate

    uploads/200510/24_211004_o_nhibernateuml.jpg

    posted on 2006-07-14 14:31 風人園 閱讀(228) 評論(0)  編輯  收藏 所屬分類: DotNet

    主站蜘蛛池模板: 57pao一国产成永久免费| 亚洲欧洲免费无码| 亚洲美女aⅴ久久久91| 午夜两性色视频免费网站| 一个人看www免费高清字幕| 亚洲精品免费观看| 国内精品免费视频自在线| 一级做受视频免费是看美女| 亚洲电影在线免费观看| 亚洲AV永久无码天堂影院| 国外亚洲成AV人片在线观看| 日本高清在线免费| 亚洲成人午夜电影| 国产jizzjizz视频全部免费| 无码av免费网站| 亚洲AV成人无码网天堂| 亚洲第一精品福利| 国产免费一区二区三区VR| 久久久99精品免费观看| 菠萝菠萝蜜在线免费视频| 亚洲理论在线观看| 亚洲午夜精品久久久久久浪潮| 亚洲天堂免费在线| CAOPORN国产精品免费视频| 亚洲中文字幕无码av永久| 亚洲Av无码专区国产乱码DVD| 国产又黄又爽又刺激的免费网址| 最近中文字幕电影大全免费版| 亚洲黄色在线观看| 亚洲一区二区高清| 日韩视频在线免费观看| 国产精彩免费视频| 免费精品久久天干天干| 一级女性全黄久久生活片免费| 亚洲一区二区三区AV无码| 韩国免费三片在线视频| 青草草色A免费观看在线| 四虎影视在线影院在线观看免费视频| 日本中文字幕免费看| 亚洲AV成人无码久久WWW| 国产成+人+综合+亚洲专|