欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
NHibernate快速指南(翻譯

NHibernate快速指南

 

什么是NHibernate

 

NHibernate 是一個(gè)基于.Net 的針對關(guān)系型數據庫的對象持久化類(lèi)庫。Nhibernate 來(lái)源于非常優(yōu)秀的基于JavaHibernate 關(guān)系型持久化工具。

NHibernate 從數據庫底層來(lái)持久化你的.Net 對象到關(guān)系型數據庫。NHibernate 為你處理這些,遠勝于你不得不寫(xiě)SQL去從數據庫存取對象。你的代碼僅僅和對象關(guān)聯(lián),NHibernat 自動(dòng)產(chǎn)生SQL語(yǔ)句,并確保對象提交到正確的表和字段中去。

 

為什么寫(xiě)這個(gè)指南

 

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

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

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

 

開(kāi)發(fā)的過(guò)程

 

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

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

2.構建一個(gè)需要被持久化的.Net類(lèi)

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

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

5.使用NHibernateAPI

 

第一步:寫(xiě)構建表的SQL

 

這里我們將使用的是一個(gè)非常簡(jiǎn)單的例子。假設你正在為你的網(wǎng)站開(kāi)發(fā)一個(gè)基本的用戶(hù)管理子系統。我們將使用如下的一張User表(假定你已經(jīng)設置好一個(gè)數據庫在的例子里我稱(chēng)它為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, 但也可以使用任何數據庫,只要你有關(guān)于它們的基于.Net數據提供驅動(dòng)程序。我們將得到一個(gè)含有LogonID,Name, Password, Email LastLogon的表. 經(jīng)過(guò)以上標準步驟,我們下一步是寫(xiě)一個(gè).Net類(lèi)處理一個(gè)給定的User對象。

第二步:產(chǎn)生一個(gè).Net 類(lèi)文件

 

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

               
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,但這個(gè)對NHibernate不是必要的.它可以使用public, protected, internal或者甚至是用private來(lái)持久化數據。

 

第三步:寫(xiě)映射文件

現在我們有數據表和需要去映射它的.Net類(lèi)。我們需要一種方式去讓NHibernate知道如何從一個(gè)映射到另一個(gè)。這個(gè)任務(wù)依賴(lài)于映射文件來(lái)完成。最易于管理的辦法是為每一個(gè)類(lèi)寫(xiě)一個(gè)映射文件,如果你命名它是YourObject.hbm.xml 并且把它放在和類(lèi)的同一個(gè)目錄里,NHiberante將會(huì )使得事情簡(jiǎn)單起來(lái)。下面是一個(gè)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>
               

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

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

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

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

 

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

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

 

第四步:為你的數據庫產(chǎn)生一個(gè)配置文件

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

               
<?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 驅動(dòng),在本地連接名稱(chēng)為NHibernate 的數據庫,提供用戶(hù)名和密碼。那里有一堆屬性你需要調整來(lái)確定如何讓NHibernate來(lái)訪(fǎng)問(wèn)數據庫。再次說(shuō)明,你可以在文檔里獲取更多信息。

請注意以上的配置里并沒(méi)有涉及到log4net的配置信息。NHibernate使用log4net來(lái)記錄內部發(fā)生的一切。在一個(gè)應用程序產(chǎn)品里,在你特定環(huán)境里,我推薦配置log4net,并為NHibernate設置一定的日志級別。

第五步:開(kāi)始展現NHibernate的魔力

 

所有艱苦的工作已經(jīng)完成。你將有以下內容

User.cs ----你需要持久化的C#類(lèi)

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

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

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

 

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

  1. 創(chuàng )建一個(gè)Configuration對象
  2. Configuration知道你將存儲何種類(lèi)型的對象
  3. 為你選擇的數據庫創(chuàng )建一個(gè)Session對象
  4. Load,SaveQuery你的對象
  5. 通過(guò)SessionFlush()方法將對象提交給數據庫。

 

為了讓你更清晰,我們來(lái)看一些代碼。

首先,創(chuàng )建一個(gè)Configuration對象

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

 

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

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

下一步,創(chuàng )建一個(gè)Session對象

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

 

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

 

接著(zhù)來(lái)Load, SaveQuery你的對象

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

               
        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();

 

正如你所看到的,關(guān)于NHiberante重要的事情是如此簡(jiǎn)單。繼續并且查詢(xún)你的數據庫,驗證一下User表里的新記錄?,F在重要的事情就是你去操心業(yè)務(wù)對象并在進(jìn)行處理的時(shí)候告訴NHibernate就可以了。

 

讓我們來(lái)告訴你,當你有一個(gè)UserID的時(shí)候如何獲取對象(舉例說(shuō),登陸你的網(wǎng)站的時(shí)候)。僅僅一句話(huà)就可以打開(kāi)Session,傳入key就可以了

 

               
        // open another session to retrieve the just inserted user
        session = factory.OpenSession();
 
        User joeCool = (User)session.Load(typeof(User), "joe_cool");
               

 

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

               
        // set Joe Cool‘s Last Login property
        joeCool.LastLogon = DateTime.Now;
 
        // flush the changes from the Session to the Database
        session.Flush();
               

 

 

你所要做的就是通過(guò)NHibernate來(lái)進(jìn)行你需要的改變,并調用SessionFlush()方法提交。驗證一下數據庫,查查用戶(hù)ID”joe_cool”的記錄中”LastLogon”的更改。

 

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

               
        IList userList = session.CreateCriteria(typeof(User)).List();
        foreach(User user in userList)
        {
               System.Diagnostics.Debug.WriteLine(user.Id + " last logged in at " + user.LastLogon);
        }
 
這個(gè)查詢(xún)將會(huì )返回所有表記錄。往往你需要做更多的控制,比如說(shuō)獲取從March 14, 2004 10:00 PM 以后登陸的用戶(hù),如下:
               
        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);
        }
               
 
文檔里還有一堆健壯的查詢(xún)方式讓你調用,這里僅僅讓你對NHibernate所提供的強有力的工具有一定的了解。
        
最后調用Session對象的Close()方法,釋放NHibernate所使用的ADO.Net連接資源
 
               
        // tell NHibernate to close this Session
        session.Close();
               
 

 

更確切地說(shuō)

 

你已經(jīng)完成創(chuàng )建對象,持久化并通過(guò)條件查詢(xún)或鍵值查詢(xún)來(lái)返回它。相信你已經(jīng)從中獲得快樂(lè )。

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

 

Enjoy! And Happy NHibernating!

Mike Doerfler

 

再次說(shuō)明,所有的權利來(lái)自Glen SmithA Hitchhiker‘s Guide to Hibernate

 

 

Translated by:  Jason Xie

Published: 2005-02-24

 

 

 

 

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
NHibernate Quick Start Guide
博客園 - Terrylee的技術(shù)專(zhuān)欄 - 基于NHibernate的三層結構應用程序開(kāi)發(fā)初步
c#開(kāi)源利器:NHibernate-ITPUB技術(shù)門(mén)戶(hù)
Hibernate 知識點(diǎn)小結
Hibernate中Could not synchronize database state with session問(wèn)題
關(guān)于POJO及DAO
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久