李匡正
現任臺灣微軟應用架構技術經理,負責開發工具暨平臺推廣。亦曾任Borland資深產品經理一職,負責軟體開發周期相關產品行銷。


ORM(Object-Relatioaln Mapping,物件-關聯映射)能讓物件導向程式語言在處理關聯式資料庫的資料時,自動將資料表轉換成物件類別庫,建立一個抽象的資料存取層,以維持物件導向觀念與設計的一致性。

無論是Java或開放原始碼陣營,ORM的應用都越來越普及,但近年來.NET平臺上一直沒有推出官方版本。不過在2008年之後,這個態勢即將改觀,微軟將推出ADO.NET Entity Framework(以下簡稱Entity Framework)和LINQ,提供ORM的解決方案。

臺灣微軟應用架構技術經理李匡正認為,Entity Framework與LINQ雖然都能作為ORM的解決方案,不過本質上卻有差異,尤其LINQ應用的層面並不局限在ORM範疇,特別允許了程式語言可以採用精簡、一致的方式存取不同的資料型態,更能彰顯它的價值。

問:微軟在2008年後,.NET平臺上將會有Entity Framework和LINQ兩套ORM的解決方案,這是否意謂著ORM將成為趨勢?
答:其實看看近幾年的發展,不論是Java平臺上的Hibernate、Spring,或是Ruby on Rails上的Active Record,都採用了,就不難看出這項技術蓬勃發展的趨勢。

微軟在推出Entity Framework和LINQ之後,解決了過去.NET平臺上只能靠社群或協力廠商支援ORM的情況,同時也正式回應ORM的發展趨勢。

問:為什麼ORM技術會盛行?
答:首先,ORM比較貼近物件導向設計的思維,可以將設計結果,很簡單地表達出來。

其次,我們可以從企業實務面來檢視。在Martin Fowler的《Patterns of Enterprise Application Architecture》一書中,將企業資料存取分成三種方式,第一種是Transaction Script,它利用自訂的類別方法將資料相關的存取包裝起來。第二種是Table Module,它將Dataset作為類別封裝和處理的單位。最後一種最完美的方法是Domain Model,它將一個類別對映一個資料表,所有資料的結果都能對映到Domain屬性。

三種當中以Domain Model最具彈性,而且最能應付企業中多變的需求與邏輯變更,但缺點是初期開發成本高。而有了ORM,可以有效降低Domain Model一開始的成本,增加軟體的彈性,架構也會更漂亮。

問:為什麼微軟會一口氣推出兩套ORM的解決方案?
答:事實上,兩者雖然都能當作ORM的解決方案,本質上卻有極大的差別。Entity Framework是框架層級的ORM解決方案,而LINQ卻是從程式語言層級實現,也就是在程式語言中實作出資料存取的功能。除此之外,ORM只是LINQ三分之一的功能。LINQ除了能存取關聯式資料庫之外,還能用一致性的方法存取物件和XML檔案,這是Entity Framework所缺乏的。

如果從關聯式資料庫的存取角度來看,微軟的確同時有兩套ORM解決方案,但在語言本質和應用上,兩者還是有許多的差別。

問:能不能進一步說明兩者間的差別?
答:就語言的應用來說,LINQ較適用於框架開發人員,而Entity Framework則較適用於應用程式開發人員。這從它們支援的資料庫也可以看出這種屬性。LINQ目前只支援Microsoft SQL Server,因為站在一個微軟的框架開發人員的角度來看,需要存取的資料來源,大概不會脫離SQL Server。但是Entity Framework就必須能介接、處理SQL Server以外的資料源,因為應用程式開發人員必須面對實際的企業各種資料來源,不可能只存取SQL Server。

問:由於兩者有部分重疊之處,微軟有沒有建議在應用上如何區分?
答:目前微軟官方還沒有正式的文件介紹,不過就兩者的特性而言,最明顯的區隔仍然是資料庫的差異,如果應用的資料庫產品超出SQL Server,那麼唯一的選擇就是Entity Framework。

另外,LINQ將查詢能力放到程式語言中,所以要在執行時期大幅度更動查詢語法,難度較高,而Entity Framework能在執行時期動態組出查詢語言,更動的難度低。因此執行時期查詢語法的複雜程度,也可以當作選擇的參考。

然而LINQ具備的物件查詢能力和XML查詢能力,這是Entity Framework所缺乏的,因此如果查詢的資料涉及關聯式資料庫以外的資料型態,LINQ就是最佳選擇。

問:看來,LINQ超過ORM的範疇,當初設計的目的是為了什麼?
答:開發LINQ的領導人是微軟的技術院士(Technical Fellow)Anders Hejlsberg,他是C#的創始人,也是.NET Framewrok底層技術的重要推手。Anders設計LINQ的初衷,可以追溯到他在Borland任職的時代。當年他曾在公開場合提過,希望能把資料存取方法融入到Delphi語言中,建立一致性的存取模式。這個夢想,如今在.NET平臺上實現。

程式開發人員經常必須面臨不同的資料型態處理,除了剛剛提到,也是最常見的關聯式資料庫之外,另外像是XML這種階層型的資料型態,以及物件導向中的種種物件資料型態也包含在內。隨著資料型態不同,存取的方式就會有差異,因此開發人員就必須學習各種資料存取方式,所寫出來的程式碼也通常是冗長、不漂亮的。

因此LINQ的目標,就是建立一個資料存取的抽象層,開發人員不用再去接觸底層細節的技術,讓資料來源的相依程度降低,把不同型態的資料存取盡可能地一致化,減少開發人員的負擔,也藉由這樣的機制,精簡程式碼。

問:用一致性的方法存取不同資料形態,好處在哪裡?
答:例如XML的查詢一直是門檻相對較高的技術,善用這個方法可以簡化處理。由於XML的資料像是DOM必須一層層去找,或像SAX必須用事件的方式觸發,這些查詢的語法都不會太漂亮,當XML階層式的結構很複雜,要找到特定節點,可能要寫非常冗長的程式碼。雖然XML本身也有一些技術嘗試解決這些問題,像是XPath,但熟悉這類技術的人數,遠少於懂得SQL語法的人,這是因為SQL接近自然語言。LINQ便是採用近似SQL的語法查詢XML,能讓程式碼精簡很多。

類似的語法也能拿來查詢物件。由於每一種物件導向程式語言都包含資料結構,例如陣列、堆疊、佇列等,要從這類物件中找到所需資料,每種語言都會實作不同的語法,程式開發人員需熟悉不同的方法,相對來說,也會增加開發人員的負擔。而透過LINQ,就能用一致的方法,查詢物件中的資料。

問:Entity Framework和LINQ正式發布的時間?
答:Entity Framework將會在2008年的上半年發布,屆時會用Update Pack的方式加到.NET Framework 3.5和Visual Studio 2008當中。目前Entity Framework已經發布beta 2版本,這版本已經提供視覺化工具Entity Data Model Wizard,開發人員在使用上將更為方便。

而LINQ將隨著.NET Framewrok 3.5發布,屆時C# 3.0與VB 9.0都將支援。文⊙黃天賜


熱門新聞

Advertisement