一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

NHibernate 變的簡(jiǎn)單

  下載示例程序代碼 - 1,162.6 KB

  前言

  這篇文章出自于我嘗試學(xué)習(xí)使用Nhiberbnate的挫敗感。我發(fā)現(xiàn)好像Nhibernate全部的介紹材料不是很模糊就是太詳細(xì)。我所需要的就是一個(gè)簡(jiǎn)單直接的教程,能讓我盡快對(duì)NHibernate熟悉起來(lái)。我從來(lái)沒(méi)有找到。幸運(yùn)的是,這篇文章將會(huì)滿足別人的這些需求。

  這篇文章有些長(zhǎng),但是我鼓勵(lì)你以你的方式來(lái)閱讀。NHibernate是一個(gè)復(fù)雜的程序,是一個(gè)綿延曲折的學(xué)習(xí)過(guò)程。這篇文章將為你踏平曲折,從幾天或是幾周縮短到幾個(gè)小時(shí)。

  問(wèn)題

  NHibernate目的是解決一個(gè)眾所周知的問(wèn)題,對(duì)象持久代碼在開發(fā)過(guò)程中的瓶頸問(wèn)題。很多文章表明:1/4到1/3的程序代碼是關(guān)于對(duì)象持久化,從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù),和將數(shù)據(jù)寫回?cái)?shù)據(jù)庫(kù)。代碼是重復(fù)的,耗費(fèi)時(shí)間的,還有很多瑣碎的代碼要寫。

  對(duì)于這個(gè)問(wèn)題,有很多解決方案是可用的。代碼生成可以在幾秒鐘生成數(shù)據(jù)訪問(wèn)代碼。但是如果業(yè)務(wù)模型改變,這些代碼需要重新生成。"對(duì)象關(guān)系映射"(ORMs)使用了一種新的方式,像NHibernate。他們管理數(shù)據(jù)訪問(wèn)更加透明,提供了很多簡(jiǎn)潔的API,可以使用一輛行代碼來(lái)實(shí)現(xiàn)加載和保存整個(gè)對(duì)象。

  介紹NHibernate

  NHibernate是一個(gè)持久化引擎框架。它從數(shù)據(jù)庫(kù)中加載業(yè)務(wù)對(duì)象,以及將這些對(duì)象的變化更新到數(shù)據(jù)庫(kù)中。從文章上面可以看出,它可以只使用一兩行代碼實(shí)現(xiàn)業(yè)務(wù)對(duì)象的加載和保存。

  NHibernate使用映射文件來(lái)引導(dǎo)從數(shù)據(jù)庫(kù)數(shù)據(jù)到業(yè)務(wù)對(duì)象的轉(zhuǎn)換。還有一種方法,你可以使用類的特性和屬性來(lái)替代映射文件。為了讓事情盡量簡(jiǎn)單,我們?cè)谶@篇文章中將使用映射文件,而不是使用類特性。另外,映射文件能夠很清晰的將業(yè)務(wù)邏輯和持久化代碼分開。

  好了,我們只需要在程序中添加幾行代碼,和為每一個(gè)映射文件創(chuàng)建持久化類,而且NHibernate可以照顧到所有的數(shù)據(jù)庫(kù)操作。真不知道使用NHibernate將為我們節(jié)省多少開發(fā)時(shí)間。

  記住在.NET環(huán)境下,NHibernate并不是唯一的ORM框架。有許多商業(yè)的和開源的產(chǎn)品可以提供這樣的服務(wù)。NHibernate是其中最流行的,主要是因?yàn)樗z傳自強(qiáng)大的Hibernate,一個(gè)Java環(huán)境下非常流行的ORM框架。另外,微軟也為ADO.NET提供了"Entity Framework",來(lái)提供ORM服務(wù)。但是,這個(gè)產(chǎn)品已經(jīng)延遲,好長(zhǎng)時(shí)間已經(jīng)沒(méi)有再釋放了。

  安裝NHibernate

  使用NHibernate的第一步就是下載NHibernate和Log4NET(一個(gè)開源的日志記錄程序,NHibernate使用它來(lái)記錄錯(cuò)誤和警告),NHibernate包含了Log4NET最新的版本,你也可以下載整個(gè)Log4NET安裝包,這里是下載地址:

  NHibernate不是直接需要Log4NET,可是在調(diào)試期間它的自動(dòng)記錄日志功能非常有用。

  現(xiàn)在開始

  在這篇文章中,我將使用一個(gè)簡(jiǎn)單的示例程序,而不是解說(shuō)如何使用NHibernate來(lái)進(jìn)行數(shù)據(jù)訪問(wèn)。這是一個(gè)控制臺(tái)應(yīng)用程序,通過(guò)消除UI代碼讓程序變的更加簡(jiǎn)單。這個(gè)程序?qū)?chuàng)建很多個(gè)業(yè)務(wù)對(duì)象,來(lái)使用NHibernate來(lái)對(duì)他們進(jìn)行持久化,然后將他們從數(shù)據(jù)庫(kù)中讀取出來(lái)。

  為了程序運(yùn)行起來(lái),你需要做一下幾個(gè)事情:

  • 為陳旭添加NHibernate和Log4NET的程序集引用
  • 為程序添加數(shù)據(jù)庫(kù)
  • 修改數(shù)據(jù)庫(kù)連接字符串

  這個(gè)示例程序引用NHibernate和Log4NET。這些應(yīng)用應(yīng)該被你的機(jī)器識(shí)別,如果你的NHibernate和log4NET安裝在默認(rèn)的目錄里。如果這些引用不被識(shí)別,你可以分別使用NHibernate.dll和Log4NET.dll來(lái)替換引用位置。這些DLL文件可以在NHibernate的安裝目錄中找到。

  這個(gè)示例程序是按照SQL Server Express 2005來(lái)配置的,數(shù)據(jù)庫(kù)文件(NhibernateSimpleDemo.mdf和NhibernateSimpleDemo.ldf)已經(jīng)打包在壓縮文件里。你可以將數(shù)據(jù)庫(kù)搭在你機(jī)器的SQL Server上。

  最后,數(shù)據(jù)庫(kù)的連接字符串配置在App.config文件中,默認(rèn)你使用的是SQL Server數(shù)據(jù)庫(kù)。你可以自己根據(jù)自己機(jī)器SQL Server的版本,來(lái)修改數(shù)據(jù)庫(kù)的連接字符串。

  業(yè)務(wù)模型

  這里有兩種方法使用NHibernate創(chuàng)建應(yīng)用程序。第一種是“以數(shù)據(jù)為中心”的方法,它從數(shù)據(jù)模型和創(chuàng)建業(yè)務(wù)對(duì)象開始。第二種是“以對(duì)象為中心”的方法,從業(yè)務(wù)模型和創(chuàng)建數(shù)據(jù)庫(kù)來(lái)持久化這個(gè)模型開始。這個(gè)示例程序使用以對(duì)象為中心的方式。

  這里示例中的業(yè)務(wù)模型:

  這個(gè)模型表現(xiàn)了一個(gè)訂單系統(tǒng)的框架,這個(gè)模型是不完整的,這里只是使用了幾個(gè)類來(lái)解說(shuō)使用NHibernate對(duì)象持久化。顯然這個(gè)模型的設(shè)計(jì)不能代表最佳實(shí)踐,但是用來(lái)展示NHibernate是怎樣工作的已經(jīng)足夠應(yīng)付了。

  此文將使用這個(gè)模型來(lái)解說(shuō)使用NHibernate進(jìn)行對(duì)象持久化的幾個(gè)概念。

  • 處理簡(jiǎn)單屬性
  • 處理Components
  • 處理one-to-many
  • 處理many-to-one
  • 處理many-to-many

  此文不會(huì)涉及高級(jí)主題,像繼承。

  這個(gè)模型由5個(gè)類組成,其中的4個(gè)是要持久化的類,非持久化類OraderSystem當(dāng)做這個(gè)對(duì)象模型的宿主。我們將會(huì)在程序運(yùn)行時(shí)初始化OrderSystem對(duì)象,然后我們將加載其他的對(duì)象到OrderSystem中來(lái)。

  OrderSystem.Customers屬性擁有銷售者的客戶列表,Customers可以通過(guò)CustomerID來(lái)訪問(wèn),每一個(gè)Customer對(duì)象擁有一個(gè)ID,name,和address、一個(gè)序列的orders。address將被包成一個(gè)單獨(dú)的Address類中。

  Order類包含了一個(gè)訂單的ID,時(shí)間,顧客信息,和許多購(gòu)買的產(chǎn)品信息。

  Product類包含ID,名稱。

  請(qǐng)注意我們只注重NHibernate是怎么工作的,程序初始化時(shí),Product對(duì)象將被實(shí)例化放入OrderSystem.Catalog屬性中,當(dāng)一個(gè)訂單被創(chuàng)建時(shí),Product對(duì)象引用將不復(fù)制到Order.OrderItems屬性中。

  NHibernate一個(gè)強(qiáng)大的特點(diǎn)就是不需要為業(yè)務(wù)類實(shí)現(xiàn)特別的接口。事實(shí)上,業(yè)務(wù)對(duì)象通常不會(huì)擔(dān)心被持久化機(jī)制來(lái)加載和保存他們。NHibernate使用的映射數(shù)據(jù)保存在分離的XML文件中。

  數(shù)據(jù)庫(kù)

  數(shù)據(jù)庫(kù)和對(duì)象模型并不是完全匹配,對(duì)象模型中包含一個(gè)Address類,但是數(shù)據(jù)庫(kù)中并沒(méi)有與之對(duì)應(yīng)的表。數(shù)據(jù)庫(kù)中有OrderItems表,但是對(duì)象模型中并沒(méi)有與之對(duì)應(yīng)的持久化的類。這里的不匹配并不是故意的,我們想展示的NHibernate其中的一個(gè)概念就是這里并不需要數(shù)據(jù)庫(kù)中的表跟類是一一對(duì)應(yīng)的。

  這里是為什么不完全匹配的原因:

  • Address類并不能代表業(yè)務(wù)模型的一個(gè)實(shí)體,相反,它只代表一個(gè)實(shí)體的值,在這個(gè)示例中,代表Customer.Address 屬性,我們將Address分離一個(gè)單獨(dú)的類,這樣我們可以解說(shuō)什么叫NHibernate使用“Component mapping”。
  • OrderItems表是多對(duì)多關(guān)系中Orders和Products的連接表,這樣也不能代表對(duì)象模型中的一個(gè)實(shí)體。

  Customer表包含了一個(gè)普通Customer信息的骨架,包含Customer的Address信息。最佳實(shí)踐不會(huì)像我們這樣,將會(huì)把Address分離在一個(gè)單獨(dú)的表中。我們把Address信息保存在Customer表中,這樣我們可以解釋什么是NHibernate使用‘Components’類,而不使用Address自己的表,我們將在下面討論Components的詳細(xì)用法。

  Orders表只包含一個(gè)訂單的最簡(jiǎn)單的信息,只有ID,時(shí)間,和CustomerID。Orders和Customers之間的關(guān)系通過(guò)一個(gè)外鍵orders.ustomerID 列對(duì)應(yīng) Customer.ID列。

  所有的訂單學(xué)要一個(gè)多對(duì)多的關(guān)系(每一條訂單包含很多條商品信息,每一條商品信息又被包含在很多訂單里),所以我們需要OrderItems表來(lái)當(dāng)作中介,簡(jiǎn)單的連接Order編號(hào)和Product編號(hào)。

  這個(gè)數(shù)據(jù)庫(kù)并不是一個(gè)最佳實(shí)踐,它所包含的信息僅僅用來(lái)展示NHibernate是怎樣工作的。

  映射業(yè)務(wù)模型

  許多介紹NHibernate的文章都是以配置文件開始的,但是從另一個(gè)地方開始:映射類。映射是NHibernate的核心,而且配置也給初學(xué)者一個(gè)很大的絆腳石。當(dāng)我們討論完映射,我們?cè)倩貋?lái)介紹NHibernate的配置部分。

  映射簡(jiǎn)單的指定哪一個(gè)表對(duì)應(yīng)哪一個(gè)類。我們把映射的類對(duì)應(yīng)的表叫這個(gè)類的“映射表”。

  我們?cè)谏厦婢鸵呀?jīng)說(shuō)了,Nhibernate不需要特定的接口或是特定的代碼寫在要映射的類里。但是它需要被聲明成Virtual,這樣可以在需要的時(shí)候創(chuàng)建代理。NHibernate文檔里討論了為什么這樣,現(xiàn)在我們把所有業(yè)務(wù)模型中的類聲明成Virtual。

  映射可以同過(guò)分離的XML文件實(shí)現(xiàn),也可以通過(guò)在類屬性上添加特性來(lái)實(shí)現(xiàn)。被用于映射的XML文件可以在任何一個(gè)項(xiàng)目里引用。為了簡(jiǎn)單,我們將展示其中一個(gè)方法:通過(guò)XML文件映射,映射文件需要被編譯成程序集的嵌入式資源。

  你可以映射很多類在同一個(gè)映射文件中,但是通常都會(huì)為每一個(gè)類創(chuàng)建一個(gè)映射文件。這樣可以保持映射文件的短小,而且容易閱讀。

  開始我們映射實(shí)驗(yàn)之前,先讓我們看看Customer.hbm.xml文件。hbm.xml后綴的文件是NHibernate標(biāo)準(zhǔn)的映射文件的后綴。我們把映射文件放在Model文件下,但是我們可以把他們放在項(xiàng)目的任何一個(gè)地方。最關(guān)鍵的一點(diǎn)是將文件的 BuildAction 屬性設(shè)置為 Embedden Resource(嵌入式資源)。這個(gè)設(shè)置將會(huì)把映射文件編譯到程序集里,這樣把他們從程序中脫離出來(lái)。

  映射文件都是標(biāo)準(zhǔn)的格式:

<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace
="NHibernateSimpleDemo"
assembly
="NHibernateSimpleDemo">

NET技術(shù)NHibernate 變的簡(jiǎn)單,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国内xxxx乱子另类 | 亚洲区小说区图片区qvod | 久久精品a国产一级 | 一区二区免费视频观看 | 色鬼综合| 精品国产制服丝袜高跟 | 女人张腿让男桶免费视频网站 | 婷婷久久综合九色综合九七 | 欧美成年黄网站色高清视频 | 成人精品一区二区三区 | 欧美另类娇小 | 一级毛片中文字幕 | 国产精品福利在线播放 | 久久久这里有精品 | 麻豆系列 | 精品色网 | 国产欧美精品专区一区二区 | 国产精品区网红主播在线观看 | 美女性色| 国产精品福利无圣光一区二区 | 影院成人区精品一区二区婷婷丽春院影视 | 色婷婷中文字幕在线一区天堂 | 激情四房| 亚洲第一区精品观看 | 曰曰啪天天拍视频在线 | 99国产精品九九视频免费看 | 免费伊人网 | 国产中文字幕视频 | 91色视频在线 | 国产高清国内精品福利 | 天天色天天插 | 女人张腿让男桶免费视频大全 | 97大香伊在人人线色 | 牛牛热在线视频 | 日本高清一区二区三区水蜜桃 | 国产香蕉成人综合精品视频 | 亚洲成人手机在线观看 | 精品精品国产自在久久高清 | 日本精品一区二区在线播放 | 国产精品免费观看网站 | 中文精品一卡2卡3卡4卡 |