李知杰++趙健飛
摘要:在開發(fā)ASP.NET MVC大中型項(xiàng)目時(shí),通常結(jié)合ORM框架技術(shù)實(shí)現(xiàn)數(shù)據(jù)庫訪問。ORM框架與SQL語句操作數(shù)據(jù)庫不同,它不要求開發(fā)人員使用SQL語句,而是以面向?qū)ο缶幋a方式訪問數(shù)據(jù)庫。微軟的企業(yè)級(jí)ORM框架稱為“ADO.NET實(shí)體數(shù)據(jù)框架”(Entity Framework,簡(jiǎn)稱EF)。它支持常見的SQL Server、Oracle等大型數(shù)據(jù)庫。介紹了ORM技術(shù)以及在ASP.NET程序開發(fā)中使用EF創(chuàng)建數(shù)據(jù)模型的3種方式。EF可以將C#代碼自動(dòng)轉(zhuǎn)成SQL語句,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫和表的操作。
關(guān)鍵詞:ADO.NET;ORM;Entity Framework;數(shù)據(jù)建模
DOIDOI:10.11907/rjdk.151487
中圖分類號(hào):TP301
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào)文章
編號(hào):16727800(2015)008005502
0 引言
傳統(tǒng)的軟件項(xiàng)目中,對(duì)數(shù)據(jù)庫的訪問通常是將對(duì)數(shù)據(jù)庫的操作通過sql語句封裝成方法,再將這些方法給主程序調(diào)用。隨著業(yè)務(wù)需求的變更和數(shù)據(jù)庫的升級(jí),每次都需要對(duì)方法中的sql語句進(jìn)行修改,而且還需要針對(duì)不同的數(shù)據(jù)庫,調(diào)整成對(duì)應(yīng)的sql語法,這無疑加大了程序開發(fā)維護(hù)的難度和風(fēng)險(xiǎn)。在開發(fā)ASP.NET MVC大中型項(xiàng)目時(shí),通常結(jié)合ORM框架技術(shù)實(shí)現(xiàn)數(shù)據(jù)庫訪問。ORM框架與SQL語句操作數(shù)據(jù)庫不同,它不要求開發(fā)人員使用SQL語句,而是以面向?qū)ο缶幋a方式訪問數(shù)據(jù)庫。微軟的企業(yè)級(jí)ORM框架稱為“ADO.NET實(shí)體數(shù)據(jù)框架”(Entity Framework,簡(jiǎn)稱EF)。它支持常見的SQL Server、Oracle等大型數(shù)據(jù)庫。EF可以將C#代碼自動(dòng)轉(zhuǎn)成SQL語句,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫和表的操作。
1 ORM概述
大中型軟件開發(fā)過程中常會(huì)使用到ORM技術(shù),ORM全稱是“對(duì)象-關(guān)系映射”(ObjectRelation Mapping)。 ORM是將關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)用對(duì)象的形式表現(xiàn)出來,并通過面向?qū)ο蟮姆绞綄⑦@些對(duì)象組織起來,實(shí)現(xiàn)系統(tǒng)業(yè)務(wù)邏輯的過程。ORM的具體含義為:O對(duì)應(yīng)程序中的類,如Customer(顧客類);R為聯(lián)系,對(duì)應(yīng)數(shù)據(jù)庫中的關(guān)系表;M表示程序中對(duì)象和數(shù)據(jù)庫中關(guān)系表的映射關(guān)系。ORM技術(shù)避免了如下兩個(gè)最常見的開發(fā)問題:
(1)操作數(shù)據(jù)庫代碼的重復(fù)性。在使用ORM之前通過ADO.NET訪問數(shù)據(jù)庫,或者將對(duì)數(shù)據(jù)庫的操作提取到一個(gè)單獨(dú)的“SqlHelper類”中,然后在數(shù)據(jù)訪問層(DAL)調(diào)用“SqlHelper類”的方法,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的操作。即使如此,在DAL仍然需要編寫大量代碼,而數(shù)據(jù)庫的訪問操作無非是增、刪、改、查4種。僅僅因?yàn)椴僮鞯臄?shù)據(jù)表結(jié)構(gòu)不同,而不得不花費(fèi)大量的時(shí)間重復(fù)編寫針對(duì)各種數(shù)據(jù)表的操作代碼,尤其是數(shù)據(jù)表數(shù)量達(dá)到百張時(shí),數(shù)據(jù)庫操作代碼工作量非常巨大。ORM技術(shù)能實(shí)現(xiàn)自動(dòng)生成這些操作代碼,開發(fā)人員可以從繁瑣的數(shù)據(jù)訪問代碼中解脫,把精力集中在業(yè)務(wù)邏輯的處理上。
(2)大量SQL語句影響程序的擴(kuò)展性和靈活性。編寫的程序和數(shù)據(jù)庫之間的耦合性很緊密,如果操作的是SQL Server數(shù)據(jù)庫,必須在DAL引入SQLServer的類庫(SqlConnection等)。如果程序需要更換為Oracle數(shù)據(jù)庫,則DAL需要更新引用Oracle類庫,所有的操作代碼和SQL語句必須全部重寫(因?yàn)槊糠N數(shù)據(jù)庫的SQL語法是不同的)。ORM解決了這種問題,使得只需編寫一次代碼,便可適用于多種數(shù)據(jù)庫。
ORM中經(jīng)常使用到“業(yè)務(wù)實(shí)體”概念。業(yè)務(wù)實(shí)體在數(shù)據(jù)庫中表現(xiàn)為關(guān)系數(shù)據(jù),而在內(nèi)存中表現(xiàn)為對(duì)象。應(yīng)用程序擅長(zhǎng)處理對(duì)象,但是很難處理關(guān)系數(shù)據(jù)。ORM通過關(guān)系數(shù)據(jù)和對(duì)象數(shù)據(jù)之間的映射,自動(dòng)產(chǎn)生SQL語句。
ASP.NET MVC應(yīng)用程序推薦使用的ORM框架為Entity Framework(簡(jiǎn)稱EF),是微軟開發(fā)的基于ADO.NET的ORM框架,主要特點(diǎn)是:支持多種數(shù)據(jù)庫;映射引擎支持存儲(chǔ)過程;提供Visual Studio集成工具,執(zhí)行可視化操作。
2 EF支持的三種數(shù)據(jù)創(chuàng)建模式
在控制器和模型的關(guān)系中,控制器總是居于“主動(dòng)”角色。控制器負(fù)責(zé)調(diào)用模型所定義的各種類,而模型提供“數(shù)據(jù)訪問服務(wù)”、 “數(shù)據(jù)驗(yàn)證服務(wù)”等功能,所以“數(shù)據(jù)建?!笔悄P偷氖滓蝿?wù)。EF支持Code First、Model First、Database First 3種方式的數(shù)據(jù)建模。
圖1 EF支持的3種數(shù)據(jù)建模方式
2.1 Database First模式
“Database First”稱為“數(shù)據(jù)庫優(yōu)先”,即先創(chuàng)建數(shù)據(jù)庫,后生成數(shù)據(jù)模型。該模式的使用前提是數(shù)據(jù)庫已經(jīng)存在并正常工作,然后使用VisualStudio EF模型設(shè)計(jì)器,根據(jù)數(shù)據(jù)庫生成數(shù)據(jù)模型。使用EF模型設(shè)計(jì)器可以隨時(shí)修改數(shù)據(jù)模型并更新數(shù)據(jù)庫。
2.2 Model First模式
“Model First”稱為“模型優(yōu)先”,這種方式是先利用某些工具(如VS的EF設(shè)計(jì)器)設(shè)計(jì)出實(shí)體數(shù)據(jù)模型及它們之間的關(guān)系,再根據(jù)這些實(shí)體、關(guān)系來生成數(shù)據(jù)庫對(duì)象及相關(guān)代碼文件。
2.3 Code First模式
“Code First”稱為“代碼優(yōu)先”,這種方式需要先寫一些代碼,如實(shí)體對(duì)象,數(shù)據(jù)關(guān)系等,然后根據(jù)已有的代碼描述,自動(dòng)創(chuàng)建數(shù)據(jù)對(duì)象,這種方法與Model First非常類似。自己寫代碼,其實(shí)就是用代碼表示實(shí)體模型,而Model First則是用可視化的方式描述了實(shí)體模型。
3 數(shù)據(jù)模型創(chuàng)建
Visual StudioEF模型設(shè)計(jì)器為數(shù)據(jù)庫創(chuàng)建了模型并在Models目錄生成.edmx文件,.edmx 文件是一個(gè) XML 文件,它用于定義概念模型、存儲(chǔ)模型和這些模型之間的映射。 .edmx 文件還包含 ADO.NET 實(shí)體數(shù)據(jù)模型設(shè)計(jì)器(實(shí)體設(shè)計(jì)器),用于以圖形方式呈現(xiàn)模型的信息。.edmx文件就是實(shí)體數(shù)據(jù)模型,使用EF模型設(shè)計(jì)器修改模型時(shí),會(huì)更改 .edmx 文件。默認(rèn)情況下,.edmx 文件使用EF模型設(shè)計(jì)器打開,也可以按照下列步驟使用 XML 編輯器打開.edmx 文件: ①確保項(xiàng)目在 Visual Studio 中打開;②在“解決方案資源管理器”中右擊 .edmx 文件,然后選擇“打開方式...”;③選擇“XML 編輯器”,然后單擊“確定”。
使用.edmx文件創(chuàng)建數(shù)據(jù)模型涉及的相關(guān)概念如下:①SSDL:存儲(chǔ)模型,指數(shù)據(jù)庫中的實(shí)體(將各個(gè)實(shí)體的關(guān)系固定到表中的形式);②CSDL:概念模型。以程序語言的角度來定義模型。即其中定義的實(shí)體、主鍵、屬性、關(guān)聯(lián)等都是對(duì)應(yīng)于.NET Framework中的類型;③映射:將概念模型和存儲(chǔ)模型連接起來,以便執(zhí)行操作,即實(shí)體·屬性(概念模型)對(duì)應(yīng)實(shí)體·字段(存儲(chǔ)模型)。
使用EF為“Meixin”數(shù)據(jù)庫建立數(shù)據(jù)模型。“Meixin”數(shù)據(jù)庫根據(jù)真實(shí)的“在線點(diǎn)餐”系統(tǒng)的用戶需求設(shè)計(jì),體現(xiàn)了核心的在線點(diǎn)餐業(yè)務(wù)數(shù)據(jù)結(jié)構(gòu),如表1所示。
數(shù)據(jù)建模操作步驟如下:①創(chuàng)建ASP.NET MVC應(yīng)用程序后,按下“Shift+Ctrl+A”快捷鍵,打開“添加新項(xiàng)”對(duì)話框,選擇“數(shù)據(jù)”,并選擇“ADO.NET 實(shí)體數(shù)據(jù)模型”,打開EF向?qū)?;②點(diǎn)擊“添加”按鈕,在 “實(shí)體數(shù)據(jù)模型向?qū)А睂?duì)話框,選擇“從數(shù)據(jù)庫生成”;③點(diǎn)擊“下一步”,在 “實(shí)體數(shù)據(jù)模型向?qū)А睂?duì)話框,創(chuàng)建數(shù)據(jù)庫連接,連接到“Meixin”數(shù)據(jù)庫,EF向?qū)ё詣?dòng)生成連接串;④將連接串保存到Web.Config,點(diǎn)擊“下一步”,選擇數(shù)據(jù)表“u_user”;⑤點(diǎn)擊“完成”,Visual Studio創(chuàng)建出數(shù)據(jù)模型關(guān)系圖;⑥EF向?qū)ё詣?dòng)生成的meixinEntities類,稱為“數(shù)據(jù)庫上下文操作類”,位于/Models/Model1.Context.cs。同時(shí)生成的m_user類,稱為“業(yè)務(wù)實(shí)體類”,位于/Models/m_user.cs。
4 結(jié)語
研究表明,在ASP.NET程序設(shè)計(jì)開發(fā)過程中,使用EF創(chuàng)建數(shù)據(jù)模型,并通過面向?qū)ο蟮姆椒▉韺?shí)現(xiàn)對(duì)數(shù)據(jù)庫的增刪改查等操作,對(duì)減少代碼重復(fù)性,增加程序擴(kuò)展性和靈活性具有積極影響。隨著移動(dòng)應(yīng)用平臺(tái)和云端數(shù)據(jù)庫的逐漸普及,選擇一款合適的數(shù)據(jù)建模方式能極大提高開發(fā)效率,并增加程序的擴(kuò)展性和靈活性,達(dá)到事半功倍的效果。
參考文獻(xiàn):
[1] TOM FITZMACKEN.Getting started with entity framework 6 database first using MVC 5[EB/OL]. https://www.asp.net/mvc/overview/gettingstarted/databasefirstdevelopment/settingupdatabase.
[2] TOM DYKSTRA.Creating an entity framework data model for an ASP.NET MVC application (1 of 10) [EB/OL].http://www.asp.net/mvc/overview/olderversions/gettingstartedwithef5usingmvc4/creatinganentityframeworkdatamodelforanaspnetmvcapplication.
[3] THOMAS M CONNOLLY,CAROLYN E BEGG.Database systems: a practical approach to design,implementation and management[M].AddisonWesley,2009.
[4] BEZNOSOV K.Design and implementation of a componentbased protection architecture for ASP.NET web services[C].Berlin: Proceedings of ComponentBased Software Engineering,2005.
[5] TOBY J TEOREY,STEPHEN BUXTON,LOWELL FRYMAN,et al.Database design: know it all[M].Morgan Kaufmann Publishers,2009.
(責(zé)任編輯:孫 娟)