NHibernate in Action(第一章1.2)
生活随笔
收集整理的這篇文章主要介紹了
NHibernate in Action(第一章1.2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.2 .NET中的持久化方法
我們已經討論過如何在一些較大的系統中使用持久層來處理加載和保存數據。現在也有很多方法可以用于實現持久層,每個方法都有各自的優點和缺點。下面是一些流行的方法:- 手工編寫代碼
- DataSets
- LINQ-to-SQL
- NHibernate(或其它類似的)
- ADO.NET? Entity Framework
1.2.1 選擇持久層 在應用程序中,你經常會加載、處理和保存數據庫的元素。不管你使用的是什么持久層,在某些時候還是必須創建ADO.NET對象和執行SQL語句的。如果你每次處理出具的時候都要手動去寫SQL將會是一件非常繁瑣的事情,因此你可以將這些底層次的工作交給持久層去做。 持久層是一套的用于使你保存和數據更簡單的類庫和公共組件。持久層通過ADO.NET執行SQL語句來實現,但是最復雜的過程是要求將這些語句封裝在組件里面,并且能夠理解如何持久化這些實體。這些組件還隱藏的具體的數據庫,量減少與數據庫的關聯使得你的應用程序更易維護。例如,當你的SQL標識中包含了空白符或者保留字時,你必須為這些標志添加分隔符。比如SQL數據庫澤添加括號,MySQL則使用back-ticks(不知道咋翻譯)。有必要將這些詳細信息隱藏起來并讓持久層選擇正確的分隔符。 根據你選擇的持久層實現方式,它們的內部關系有很大的區別。 手寫持久層 自己編寫持久層將包含許多工作。首先通常會建立一套通用的功能來處理數據庫連接,執行SQL語句等等。接著在底層的最頂端,需要建立另外一套功能來保存,加載和查找你的業務實體。如果你需要引入緩存,業務規定約束或者處理實體之間的關系的時候,事情就變得更加復雜。 手工編寫使你的持久層有更大靈活性和可控性;你具有自由的設計的權限和能夠簡單的開發特定的數據庫功能。但是這些仍然需要大量的工作且是非常繁瑣的事情,即使你使用代碼生成。 基于DataSet的持久層 ?????? Visual Studio可以使你很高效的生成你的持久層,通過幾次點擊就可以擴展你的新功能。Visual Studio生成的類知道如何訪問數據庫已經如何通過DataSet來加載和保存實體。
????? 另外,只需一點工作就可以開始了。但是你如果你需要控制其他東西就必須手寫代碼了,這是經常發生的(在1.3節將會介紹)。 NHibernate持久層 ??????NHibernate提供一個快速建立持久層代碼的所有功能。它可以加載和保存整個對象管理同時維護它們之間的關系。 例如一個拍賣應用(例如eBay),NHibernate可以通過一個像下面這樣的接口函數輕易的保存一個Item和Bids: ???? public void Save(Item item) {
????? ???OpenNHibernateSession();
????? ???session.Save(item);
????? ???CloseNHibernateSession();
??? ?} ???? 在這里,Session是NHibernate提供的 一個對象。不用擔心看不懂代碼,現在我們只是想讓你了解一下NHibernate如何簡單的實現持久層。我們將在第二章開始講NHibernate,你就會發現它是直接執行持久化操作的。你只要做的就是編寫實體類和接受NHibernate如何去持久化這些實體。在深入探討NHibernate之前,我們先來簡單的看一下微軟最新介紹的持久化技術。 基于Linq-to-SQL的持久層 語言基礎查詢(LINQ)是由微軟2007年開發的。他能夠實現查詢和以及集合的操作,像C#和VB這樣的.net語言提供了一組擴展,使得這些操作就像數據庫提供的SQL語言一樣。LINQ的目標是想讓查詢變成變成編程語言的一部分。LINQ to SQL通過LINQ的擴展提供語言級的數據訪問。它是基于ADO.NET來實現表,行與類和對象直接的映射關系。 LINQ to SQL使用.NET的用戶自定屬性和xml文件來表示映射信息。這些信息用于自動處理關系數據庫中的持久化對象。一個表格映射到一個類,表格中的列可以映射到類的屬性,表格直接的關系也可以通過屬性來表示。LINQ to SQL通過動態SQL語句或者存儲過程自動追蹤對象和數據庫的修改及更新。通常的當你使用了LIING to SQL,那么大多數時候是不需要寫SQL語句的。 和NHibernate比起來LINQ to SQL有一些主要的局限性。例如,它是映射是類與表格直接嚴格一一對應的,它不可以實現基于類屬性和表格列之間的映射。雖然你可以創建一個自定義的LINQ 數據庫類型,但是linq to sql 主要還是針對SQL數據庫的解決方案。
???? ADO.NET ENTITY FRAMEWORK ADO.NET ENTITY FRAMEWORK是微軟在.NET 3.5 SP1中提出的一個新的持久化方案。從一個高層次來說,他依靠微軟的全力的商業支持和背景,計劃提供一個與NHibernate類似的持久層。這個承諾對于那些需要供應商支持解決方案的開發者來說是個非常吸引的選擇。但是在編寫此書的時候,Entity Framework還是早期的beta版本而且還有很多功能集合未完成。 ADO.NET ENTITY FRAMEWORK 1.0版本提供了對多種數據庫的支持以及更復雜的映射。但是它不會真正的支持“對象第一”的開發,最早也要到2009年的第二版才會支持通過mapping來生成數據庫表。對于那些要求嚴格的ORM,NHibernate還是
有明顯的優勢。 1.2.2 實體的實現 一旦你選擇一個持久層的解決方案,那么你就得開始建立程序需要操作的業務對象或者實體。這些類表示的是程序需要操作的現實中的元素。對于拍賣程序程序來說,User,Item和Bid是一個簡單的例子,我們接下來會討論如何實現上述三種方式的業務實體。 手工編碼的實體
???? 回過來看拍賣系統這個例子,假設需要的實體有:User,Item和Bid。除了他們包含的數據之外,你還希望他們之間有一些關系。例如,一個Item包含了一個Bid集合,一個Bid有與一個Item管理。在C#的類中,他可以用item.Bids這樣一個集合表示,用biid.Item這樣的屬性表示。面向對象的視圖不同于關系視圖,它沒有主外鍵,只有關聯關系。面向對象同時也提供了一些強大的模型概念,比如繼承和多臺。 手工編寫的實體不受其它任何約束,它們甚至可以定義實體在數據庫持久化的方式。他們可以獨立的使用和供其它系統共享使用,這對于復雜的環境是非常重要的好處。
???? 但是他們編碼起來非常繁瑣和困難。考慮到我們必須使用手工編寫繼承于其它實體的持久層實體,通常會使用代碼生成或者一些基類(例如DataSet)來盡量減少添加功能的工作量。這些功能可能關系到一些持久層,交互或者信息的表現。所以如果沒有一個有用的框架,這些功能將會花費很多時間來實現。
???? DataSet中的實體 一個DataSet表示了一個集合的數據庫表,對應的,這些表格也包含了相應的實體。DataSet存儲業務對象的方式很像數據庫。你可以很容易使用自動生成類型的DataSet來修改數據,通用它也可以用于插入業務邏輯和規定。 .NET和IDE提供了許多維護DataSet數據的功能。但當你考慮以面向對象設計的的方法來考慮業務對象時,DataSet(無論是否有類型的)就能難滿足要求。畢竟,業務對象必須表現現實的元素,這些元素要有數據和動作。他們可能會被一些想繼承這樣的高級關系連接起來,但是DataSets無法實現這些。這個層次上的實體設計自由只能通過手動編寫才能實現。
?????NHibernate中的實體 NHibernate是非強加性的。你可以使用它來手動編寫(或生成)實體。你必須提供表明這些實體如何加載和保存的映射信息。做完這些后,NHibernate就可以開始負責保存或從數據庫中取出你的面向對象實體。
???? 對象與關系數據之間有幾個主要的不同點。如果試圖將這兩者一起使用的話將會產生范式失配(也叫做對象關系阻抗失配impedance mismatch).我們在1.3節將探討這種適配。在本章的結尾,你將會對導致范式匹配的原因及NHibernate如何解決這個問題有一個清晰的概念。 ENTITIES與LINQ to SQL LINQ to SQL跟NHibernate的ORM實現方式很相像。LINQ to SQL使用POCO對象來表示你應用程序的數據(實體)。對象和數據庫表中的映射是通過代碼中的屬性和xml文本來表示。映射和實體類編寫完成之后,LINQ to SQL框架會生成數據庫操作的語句。 一旦實體類被引入,你必須考慮如何呈現給用戶端。 1.2.3? 在用戶界面顯示實體 使用NHibernate意味著要使用實體類,而使用實體類則影響UI的實現方式。對于客戶端來說,UI是非常重要的元素。無論是web應用程序(使用ASP.NET)還是Windows應用程序,都需要滿足用戶的需求。雖然深入討論UI如何實現并不是該書的一部分,但是持久層的實現方式卻直接影響的UI的實現。 在本書中,我們把UI當做表示層:.NET提供了顯示信息的控制方法。這些簡單的操作都依賴于信息的存儲方式。 我們不期望.NET實體的綁定方式會很快改變。雖然微軟已經開始積極推動用戶在.NET應用程序中使用實體類,像公司一直在推廣ADO.NET Entity Framework 和LINQ to SQL。出于這個原因,我們這一節中不會討論相關的技術。 基于DATASET的表示層
?????微軟已經為大部分.NET控件添加了對DataSet數據綁定的支持。它能夠很容易的將DataSet綁定到控件上,以便于顯示信息和DataSet的變化(用戶觸發)做出響應。 使用DataSet可能是最高效的實現表現層。你可能會對數據如何顯示失去一些控制,但是它能夠滿足大多數情況。這種情況下手工編寫實體將會更加復雜。 表示層與實體類 NHibernate數據綁定的手工編碼實體類通常是件困難的事情。因為實體類經常表現為各種形式。DataSet通常是由表格、列和行組成的,但是手寫實體類---你自己設計的類---包含了字段和方法不包含標準化得訪問和顯示方式。.NET運行我們將對象的公共屬性綁定到控件上。這對一些簡單的問題已經足夠了。如果你想要更加靈活,你就必須手寫一些代碼來獲取實體數據到UI中并保存回數據庫。 手寫實體與UI綁定還是相當的簡單。但是,如果你覺得這樣還很麻煩,那么你可以嘗試使用一些開源的項目來解決這個問題。、ObjectViews就是其中一個。
???? 同樣,當你處理一些邊緣問題,比如一些復雜的報表的時候,不要忘記你還是可以使用回DataSet的,DataSet在這方面維護起來更加簡單。事實上,在編碼過程中,很少有報表工具能夠很好的支持實體綁定,所以DataSet可以說是你的最佳選擇。我們會在第九章討論這個問題。 使用持久化信息將會影響UI的設計方式。數據必須在UI打開的時候加載并且在它關閉的時候保存。NHibernate提供了一些用于處理該過程的建立,你可以在第八章看到。 1.2.4 實現CRUD操作 當你使用持久化信息時候,你就必須關注如何持久化和檢索信息。創建,讀取,更新,刪除(CRUD)操作是最原始的操作即使是最簡單的應用。大多數時候這些操作都是由表示層觸發的。例如,用戶可能點擊一個按鈕來顯示一個元素。持久層將會去加載這個元素,并將它綁定到表單并顯示出來。 無論你似乎用的是什么方式,這些原始的操作都很好理解也很好實現。一些復雜的的操作會在下一部分講。 手寫代碼的CRUD操作
?????手寫的CRUD操作可以確切的執行你想要的東西,因為執行了自己編寫的SQL語句---但是這仍然是非常繁瑣的工作。所以有必要引進一個框架來生成這些SQL語句。一旦你知道加載一個實體就是從數據庫中執行一個SELECT語句,你就可以自動生成這些原始的CRUD操作。但是對于一些復雜的查詢和關聯實體,你就必須編寫更多代碼來實現。 DataSet的CRUD操作
?????你知道大多數持久層都可以使用DataSet來生成。這寫持久層包含了一些執行CRUD操作的類。同時VS 2005和.NET2.0也提供了更加強大的類:TableAdapters。 這些類不僅支持這些原始的CRUD操作,而且他們還是可擴展的。你不僅可以添加函數來調用存儲過程或者點擊幾下就可以生成SQL語句。但是如果你想實現一些復雜功能,你就必須進行編碼。下一節你就會看到有些有用的功能并不是那么容易實現的,而且DataSet這樣的結構可能使得實施變得更復雜。 NHinernate的CRUD操作 ???????一旦你寫好了NHibernate的實體映射信息,你就可以通過調用一個函數來實現CRUD操作。這是ORM工具的一個基本功能。如果你提供了它所需要的所有信息,那么它就可以解決每個操作引起對象關系失配。 NHibernate能夠搞笑的執行CRUD操作。經驗和不斷的測試可以幫助你發現很多優化途徑和最近實踐。例如,當你在處理實體的時候,你可以通過延遲加載用戶提交的事務來達到最佳實踐。這個時候,你就只需使用一個連接就可以保存所有的實體。
???? LINQ to SQL的CRUD操作 從表面上看,LINQ to SQL 的CURD操作跟NHibernate非常類似---你可以通過一個簡單的函數調用來加載,保存,更新和刪除對象。LINQ to SQL的實體提供較少的的CURD的細節操作,可能是好事也可能是壞事,這依賴于你項目的復雜程度。
?????現在我們已經降到了大部分的持久化步驟和操作,同時我們也探索了NHibernate的一些高級功能。
轉載于:https://www.cnblogs.com/coolkiss/archive/2010/02/10/1667029.html
總結
以上是生活随笔為你收集整理的NHibernate in Action(第一章1.2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 13. 谈谈 Redis 的过期策略
- 下一篇: 图片转链接,免费。