專刊內文

當前位置:首頁>專刊分享>內文

瀏覽次數 : 5550



 

再次革命--Entity Framework

訊光科技 / Andy Kao
2010 / 4 / 8



前言


2009年微軟在.NET 3.5中推出Entity Framework,號稱是微軟將來在.NET上的O/R Mapping重大解決方案,它也將成為微軟跨越所有應用程式的資料整合技術方案,隨著VS2010與.NET 4.0的推出,Entity Framework更進展到了4.0 (跟著.NET版本走),除了提供多項重大新功能外,微軟更宣佈EF將取代LINQ to SQL的發展,成為資料庫存取的主流技術,因此,EF將大大的影響你我資料庫開發的模式,看來我們這些無奈的資訊業者也將要再被深深革命一次,就算今天可以不變,但明天還是得被迫改變…


何謂Entity Framework


甚麼是Entity Framework?全名應該是:ADO.NET Entity Framework,是微軟以 ADO.NET 為基礎所研發出來的類似ORM架構解決方案,注意的是,ORM (Object-Relational Mapping )只是一個以物件導向的方式來存取資料庫欄位的架構而已,並非一個解決方案,如原來的ADO.NET只有資料庫連線,你只能下達SQL語法後才能知道是否有這個Table與這些欄位,很容易出錯,但在ORM的架構上,Table會強迫物件化,因此你改用物件導向的語法來存取欄位,更符合現代的開發模式與容易閱讀性。

但是,ORM也只能做到物件導向架構而已,從資料庫中取得資料與資料的維護(Insert/Delete/Update)都必須自行封裝在這個ORM的Class中,因此微軟就在.NET 3.5之後將其擴充成為"解決方案"等級,除了透過EDM(Entity Data Model)自動化定義資料模型取代需要半人工定義的ORM Class之外,更重要的是已經可以自動幫你做到資料的讀取與維護等等,不必再自行下達SQL語句。更令人振奮的是無關資料庫的類型,不管你是MS-SQL還是ORALCE或其他資料庫等等,都可以用同一套元件與程式來處理,這些概念筆者一等就是數十年,資料庫開發工具難得終有這天的到來,當然,不代表完美無缺,也無須誇大,只是有個好的開始。


Entity Framework的架構

Entity Framework的架構如圖的左側所示,其核心就是EDM的架構,從EDM來看他有三個模型(層次):



1. Conceptual Model(概念模型):使用CSDL來定義(概念結構定義語言),從使用者UI的前端程式來看,使其可以被抽象與揭露欄位屬性,讓前端可以用物件導向方式來存取。

2. Storage Model(儲存模型):使用SSDL來定義(儲存體結構定義語言),就是實際的Table結構,依不同資料庫與Table實體對應上,用來對於實際資料庫下達正確的SQL命令。

3. Mapping(對應模型):使用MSL(對應定義語言),目的是用來對應概念欄位到實體欄位的雙向對應關係。

從這三層來看,可以預見就是前端的概念欄位很抽象,後端的實體儲存欄位很具體,透過Mapping對應層會自動處理,不必我們擔心這些對應關係,如圖右側前端的程式透過Entity SQL(不是一般的SQL,專門針對Entity所用的SQL語法)或LINQ to Entity(LINQ語法)來向EntityClient取得資料,或是使用IEnumerate(陣列或列舉)來存放資料對象等等。

中間的核心就是EntityClient,用來與ADO.NET溝通並負責與資料庫的連線控制與存取等等,在EF中,EntityClient已經被往前包裝成Object Service(物件服務層)讓開發者更容易使用Entity SQL或LINQ來控制資料庫的存取,因此EntityClient必須根據EDM的對應關係,對ADO下達實際的SQL命令,也因為此,EntityClient必須由各家資料庫廠商所提供的Provider來進行各種資料庫差異的SQL語句變化。


Entity Framework的優點

為何要使用Entity Framework?可不是因為他出自微軟或是他很流行,很先進,我們簡單來了解一下:

1. 符合物件導向原則:承如上面所說的,EF改良自ORM的架構,所以將Table封裝在EDM中,因此我們可以透過物件導向的語法來存取這些Table的欄位並且可以執行這些Table抽象後的方法(如Insert/Update/Delete/Query等),這種開發模式是在編譯期可以發現錯誤或有問題的地方,不像傳統ADO開發,必須到了Runtime才發現錯誤,更符合現今的品質概念。

2. 隔離資料庫:因為開發過程中使用了Entity SQL或是LINQ,這樣可以透通在不同的資料庫間,不必因為資料庫不同,而造成程式必須改寫的命運.(當然必須配置不同的資料庫廠商所提供的Provider)。

3. 自動化的存取:因為EF已經不是一個簡單的ORM架構而已,Object Service層已經為你提供了Insert/Update/Delete的服務,當然是提供最基本的,複雜或困難的交易處理,也是要使用Entity SQL另外開發。

4. 更容易開發與維護:EDM的產生可以透過Visual Studio的工具以拖拉的工具來自動幫你產生,你可以不必自己建立,加上可以自動處理資料的SQL,會讓你開發資料庫軟體變得更輕鬆與省事。

5. 更好的效能:理論上,使用了EF架構後應該速度效能會變慢,因為多了一層EDM的轉換與分割,沒錯,但筆者說的效能,是因為他具有延遲載入的功能,如一開始的新增,你不必啟動後面的SQL去讀取資料,或是在Master/Detail間,當沒有處理到Detail時,可以不必預先去讀取Detail資料等等,針對關聯的外鍵資料(Foreign Keys)可以要使用時才去讀取等等,只要控制得宜,都會讓你具有一定的效能。

6. 更容易分層處理:早期使用ORM的架構最難的就是資料分層,在N-Tier架構上必須定義多份的Table Class,因為在N-Tier中並無法透通這些Class定義,造成開發上的困擾,但因為.NET 3.5以後的WCF (Windows Communication Foundation)支援了EF EDM的proxy class功能,讓分層的另一端也可以共用EDM內的class定義。

7. 更具未來性:目前包括WPF或Silverlight等微軟新的主流大都是以Entity為對象來呈現與操作,不再以ADO.NET的DataSet或DataTable的方式來處理,先不必說全部都轉過來,已不大可能這樣處理,但至少新開發的架構,可以使用EF來處理,另一個更好的好處就是,這麼強大的解決方案,是被放置在.NET 4.0中,你可以輕易的享受且免費使用。


EEP2010的Entity Framework架構

既然EF是個好東西,而且深深影響業者的未來,因此我們在EEP2010中除了相容之前EEP2008的原有功能外,也整合最新的EF技術進來EEP2010的架構中,並以WCF的新技術處理N-Tier的分層處理,簡單說明EEP2010的特色如下:

 1. 相容於EEP2008EEP2010須配合使用VS2010,但原來在EEP2006/EEP2008可以轉移到新的VS2010中來使用。

 2. Connection集中控管:在EF中是以ObjectContext來與資料庫連線與溝通,我們將其抽象到Application上,以EEP的概念抽象與集中資料庫的連線管理。

 3. 無關資料庫類型:採用EF為核心的好處就是不會被資料庫綁架,不管你採用哪一種資料庫,都是採用相同的元件與程式碼。

 4. 提供efCommand元件:在新的EF架構中,採用Entity SQL來做為取得Entity 的資料,而非SQL語句,因此我們將Command的特有功能,如多公司欄位或權限管理等特殊功能封裝在efCommand元件中,並且利用Entity SQL來讓Entity可以有多型(如變化欄位)的使用空間。

 5. 封裝商業邏輯為單一獨立單元:為了落實SaaS的概念,將Server端的商業邏輯封裝成獨立的DLL,除了避免相互個體的影響之外,更方便你佈署與版本管控。

 6. WCF處理N-Tier:將Web Client(或是Windows Client)Server端的存取資料改以WCF的遠端服務,用來透通後端的Entity到前端也可以使用O/R Mapping的方式。

 7. 資料服務抽象化:將WCF所提供的資料服務抽象化,實現同一個接口與Log服務,可以來達到集中控管服務對象的自動紀錄功能。

 8. 服務實體化:不同於資料服務,為了達到在設計時期實現智能感知的提示功能,將遠端呼叫服務改以實體化接口,以滿足現代的開發技術,同樣使用Call By Object方式傳送Session物件,以方便Server進行管理與控管遠端的Service

 9. 提供Load Balance機制:分層的Application Server提供負載平衡的功能,可以讓Server具有平行處理的能力,以面對更多的User同時使用。

 10. 自動化Wizard:提供精靈式的開發模式,可以自動為你快速產生Server端的服務,與Client端的網頁,讓你的生產力可以大幅提升。

11. 多元化的ClientUI:我們將提供SilverlightWindowsClient端與JQueryExt JSAjax活潑的Web介面供開發者來整合,讓你的Client可以更有彈性與多樣性。

 12. 開放所有Source Code:開放Source Code是現代軟體應該具備的基本概念,目的是讓開發者可以快速移轉技術與達到共同成長為目的,更可以讓業者得到更多的安全保障。

 註:EF新功能收納在EEP2010EF Module中,此為選購模組,且原有EEP2008功能將可以升級到EEP2010中相容使用。


結語

對一家專業從事軟體工程的業者,跟從微軟走的技術路線可以說是憂喜參半,喜的是微軟一直以最快的速度推出新的技術與新的平台,為了能夠在軟體工程與開發技術上做出對業者更大的貢獻,這樣我們就可以享受這些新技術所帶來的好處與便利;但憂的是,變化很快也很大,我們所從事的技術經常必須不斷的被更新與替換,往往一個技術才弄懂摸熟,新的技術就已經又出現了,光是跟上微軟就必須花上很多的時間去了解一些新技術的應用…甚至會做白工。

名作家村上春樹在"關於跑步"提到,「痛是難免的,苦卻是甘願的」,用我們台灣很流行的一句話「歡喜做,甘願受」,這就是訊光追求技術的執著,或許在 Entity Framework中,EEP2010中有50%的工作都被EF所完成了,這當然是好事,因為代表微軟進步了,而且會讓EEP的品質更上層樓,畢竟多一分開發工作就多一份品質負擔,在這個品質世代中,唯有不寫程式所帶來的品質是最高的,這個觀念已經成為普世價值,期待業者從這次的重大變革當中,得到更多的效率與品質,讓我們共同努力吧。(完)