五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > Castle實(shí)踐筆記以及關(guān)于使用ActiveRecord時(shí)的集合類映射問題

Castle實(shí)踐筆記以及關(guān)于使用ActiveRecord時(shí)的集合類映射問題

文章來源:365jz.com     點(diǎn)擊數(shù):675    更新時(shí)間:2009-09-20 09:04   參與評論

     近期在項(xiàng)目中使用Castle ActiveRecord(以下簡稱AR)以及它的IOC容器,對于AR,總的來說使用起來的感覺還是蠻易用的,因?yàn)闆]有系統(tǒng)學(xué)習(xí)過Nhibernare,所以對它的底層沒有太多體會,使用的時(shí)候還是得比較謹(jǐn)慎的;

     在開發(fā)過程中,最頭痛的就是使用AR來實(shí)現(xiàn)復(fù)雜的數(shù)據(jù)提取的時(shí)候,非常的束縛,雖然有Hql支持,但是在整體結(jié)構(gòu)上,還是讓代碼顯得混亂,這時(shí)候就開始試想NHibernare在這方面是如何做的,說到復(fù)雜,就必然提到關(guān)聯(lián)提取,對于ORM而言,提取出來的數(shù)據(jù)是要映射到對象上的,問題就在這里,很多時(shí)候,需要提取的數(shù)據(jù)并非一個(gè)完整的預(yù)先定義的實(shí)體,要是能返回一個(gè)DataSet或者DataRow,那樣不就非常方便了?查閱了一些資料,沒有得到多少答案。

     暫時(shí)先不說這個(gè)理想的彌補(bǔ)的方式,先回到Nhibernate上來,對于AR而言,它底層是基于Nhibernate,只是一個(gè)包裝型的框架,它讓我們可以從大量的配置文件中解脫出來,用簡易的屬性來代替映射文件,但是這樣也有很大的問題,首先屬性是不可能完全的代替映射配置文件,自由度和可控性不如配置文件,不過Castle的觀點(diǎn)是認(rèn)為這是不需要專注的部分,應(yīng)該自動的實(shí)現(xiàn)配置映射,總之AR只是Nhibernate的一個(gè)子集,另外就是一個(gè)更為顯著的缺點(diǎn),因?yàn)槭褂脤傩?使得AR的實(shí)體類不單純,同時(shí)還給每個(gè)實(shí)體增加一個(gè)AR基類, 這樣就更加限制了移植性,甚至讓我考慮實(shí)現(xiàn)多套實(shí)體來彌補(bǔ)…

     已經(jīng)在網(wǎng)上看過非常多關(guān)于ORM的討論,性能是最為尖銳的問題,這就不說了,不管如何,ORM確實(shí)是好東西,解決OO和數(shù)據(jù)庫設(shè)計(jì)不一致,對二者進(jìn)行了隔離;既然使用了ORM,就要理解它的底層,最終都是要滿足項(xiàng)目的需求,如果性能瓶頸真是出在OR上,那就不必非要選擇它.

 

關(guān)于AR的一些評價(jià)參考http://www.cnblogs.com/bluewater/archive/2007/08/14/855557.html

 

隨著項(xiàng)目的進(jìn)行,使用AR的過程中越發(fā)覺得不理解底層所封裝的Nhibernate,是很難駕馭好它的,先來看看Nhibernate文檔中對于持久化集合類的說明:

以下為原文檔引用:

NHibernate可以持久化以下集合的實(shí)例,

包括System.Collections.IDictionary,System.Collections.IList, Iesi.Collections.ISet和任何持久實(shí)體或值的數(shù)組。類型為System.Collections.ILst的屬性還可以使用"bag"語義來持久。

警告:用于持久化的集合,除了集合接口外,不能保留任何實(shí)現(xiàn)這些接口的類所附加的語義(例如:Iesi.Collections.ListSet帶來的迭代順序iteration order)。所有的持久化集合,實(shí)際上都各自按照System.Collections.Hashtable, System.Collections.ArrayList, Iesi.Collections.HashedSet的語義直接工作。更深入地說,對于一個(gè)包含集合的屬性來說,必須把.NET類型定義為接口(也就是IDictionary, IList或者ISet)。存在這個(gè)限制的原因是,在你不知道的時(shí)候,NHibernate暗中把你的IDictionary, IList 和 ISet 的實(shí)例替換成了它自己的關(guān)于這些集合的實(shí)現(xiàn)。(所以在你的程序中,謹(jǐn)慎使用==操作符。)

集合遵從對值類型的通常規(guī)則:不能共享引用, 與其包含的實(shí)體共存亡。由于存在底層的關(guān)聯(lián)模型,集合不支持空值語義;并且NHibernate不會區(qū)分一個(gè)null的集合引用和一個(gè)不存在元素的空集合。

集合類在被一個(gè)持久化對象引用的時(shí)候,會自動持久化,當(dāng)不再被引用時(shí)將會自動刪除。如果一個(gè)集合被從一個(gè)持久化對象傳遞到另一個(gè),它的元素可能會從一個(gè)表轉(zhuǎn)移到另一個(gè)表。你應(yīng)該不需要對此特別關(guān)心。就如同你使用普通的 .NET集合類一樣使用NHibernate的集合類,但是你需要確信使用前你理解了雙向關(guān)聯(lián)的語義(后面會討論)。

     集合實(shí)例在數(shù)據(jù)庫中根據(jù)指向?qū)?yīng)實(shí)體的外鍵而得到區(qū)別。這個(gè)外鍵被稱為集合的關(guān)鍵字。在NHibernate配置文件中使用 <key> 元素來映射這個(gè)集合的關(guān)鍵字。

     集合類可以產(chǎn)生多種映射,涵蓋了很多常用的關(guān)系模型,值集合,多對多關(guān)聯(lián),一對多關(guān)聯(lián),等等,具體可以參考Nhibernate官方文檔的集合類映射章節(jié),這里要說的是AR中,因?yàn)槭菍hbernate的包裝,所以它依然要使用以上所提到的三個(gè)集合類型,IList集合則是AR中普遍提供的返回集合類型,對于IList,.net中的可索引的集合的抽象基類,在用代碼生成工具生成的AR實(shí)體中可以看到關(guān)聯(lián)集合的屬性是IList類型,NHibernate不支持帶有索引的集合(IList,IDictionary或者數(shù)組)作為"多"的那一端的雙向one-to-many關(guān)聯(lián),你必須使用集合或者bag映射。

     AR在處理這種關(guān)聯(lián)的時(shí)候,使用bag映射,PersistentBag,返回Ilist集合,根據(jù)上面引用文檔中提到的,關(guān)聯(lián)的Ilist集合是依賴于Session和實(shí)體關(guān)聯(lián),當(dāng)實(shí)體消亡,Ilist也就無法使用了,所以當(dāng)我們在Lazy模式下試圖利用實(shí)體中的關(guān)聯(lián)來取得這個(gè)集合的時(shí)候,會失敗報(bào)錯(cuò)”No Session”,除非我們在代碼里先取得了這個(gè)實(shí)體,在Session存在的情況在才可以獲得關(guān)聯(lián)的集合,這就是問題,很自然的關(guān)聯(lián)卻無法在底層封裝好來使用,不得不在業(yè)務(wù)層使用的時(shí)候反復(fù)的使用using(new SessionScope()){… }來進(jìn)行Lazy方式的提取,而同樣的返回Ilist的方法,比如FindAll(),取得所有實(shí)體,則是可行的,這里沒有理解Nhibernate對于集合類的映射方式,那我們就會非常的不解,AR將這些配置都隱藏了,而我們不了解Nhibernate,于是我們很困惑AR關(guān)聯(lián)特性的使用,為了更好的使用AR,我們還是得先學(xué)習(xí)了解Nhibernate,對于集合類的使用以及關(guān)聯(lián),需要了解基本的持久化集合,關(guān)聯(lián)實(shí)現(xiàn),延遲等以及了解一些一級,二級緩存的概念。

 

Nibernate入門文章參考http://www.cnblogs.com/bluewater/archive/2007/08/14/855547.html

最好的就是先閱讀官方文檔,有詳細(xì)說明(^^閱讀中,收獲不小)

 

以上對AR使用以及理解一些Nbinernate的映射做一些筆記,多為個(gè)人理解,請多多指正;不斷學(xué)習(xí)中。

作者:wsky (huangxu)
出處:http://wsky.cnblogs.com/
以上文字若無注明轉(zhuǎn)載字樣則為個(gè)人原創(chuàng),轉(zhuǎn)載請保留簽名
Tag標(biāo)簽: Castle,ActiveRecord,ORM,抽象集合,Bag映射,Nhibernate

如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答!! 點(diǎn)擊進(jìn)入論壇

發(fā)表評論 (675人查看,0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號