李潔
摘要:該文主要研究了微軟的Entity Framework是如何工作的,以及Entity Framework實(shí)現(xiàn)的三種方法,并且為不同的場(chǎng)景該如何選擇哪種方法做了一些討論。還論述了LINQ to Entities如何查詢實(shí)體數(shù)據(jù)模型和Entity SQL如何去查詢實(shí)體數(shù)據(jù)模型。
關(guān)鍵詞:ORM 實(shí)體對(duì)象;數(shù)據(jù)模型;Entity Framework
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)10-0013-02
1 概述
Entity Framework是微軟公司開(kāi)發(fā)的對(duì)象關(guān)系映射工具(Object Relational Mapper簡(jiǎn)稱ORM),他實(shí)現(xiàn)業(yè)務(wù)模型和關(guān)系型數(shù)據(jù)之間的相互映射。開(kāi)發(fā)人員基本可以在不使用底層代碼的情況下實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)(data access)。Entity Framework給開(kāi)發(fā)人員提供了一套易于理解的基于模型的系統(tǒng),它可以將開(kāi)發(fā)人員從編寫(xiě)數(shù)據(jù)訪問(wèn)層和域模型相同的代碼的工作中解脫出來(lái)。Entity Framework的最初是隨著.NET Framework 3.5 SP1和Visual Studio 2008 SP1一起發(fā)布的,名稱為Entity Framework 3.5,目前的最新版本是Entity Framework 7。
Entity Framework可以非常容易的將概念模型的實(shí)體和關(guān)系生成數(shù)據(jù)訪問(wèn)層。應(yīng)用程序可以非常容易的執(zhí)行CRUD(create,read,update,delete)操作,以及實(shí)體間的一對(duì)一、一對(duì)多和多對(duì)多的關(guān)系。Entity Framework還有很多好處,比如:可以比ADO.NET進(jìn)行數(shù)據(jù)訪問(wèn)更加快捷,可以通過(guò)高級(jí)程序語(yǔ)言(C#等)來(lái)編寫(xiě)數(shù)據(jù)訪問(wèn)邏輯等。Entity Framework與數(shù)據(jù)庫(kù)的訪問(wèn)最終還是通過(guò)ADO.NET來(lái)完成的。
2 理解實(shí)體對(duì)象模型
概念數(shù)據(jù)模型是Entity Framework的關(guān)鍵。為了使用Entity Framework,我們必須創(chuàng)建概念數(shù)據(jù)模型實(shí)體對(duì)象模型(Entity Data Model,簡(jiǎn)稱EDM)。EDM定義了模型類、類和類之間的關(guān)系以及模型和數(shù)據(jù)庫(kù)圖表的映射。
EDM一旦被創(chuàng)建,就可以執(zhí)行對(duì)概念模型執(zhí)行CRUD的操作,該操作將對(duì)象查詢裝換為數(shù)據(jù)庫(kù)查詢。查詢后的結(jié)果將通過(guò)Entity Framework再一次裝換為概念模型。Entity Framework將實(shí)體對(duì)象查詢和數(shù)據(jù)庫(kù)查詢的轉(zhuǎn)換關(guān)系,關(guān)系型數(shù)據(jù)和概念模型的映射關(guān)系存儲(chǔ)在EDM中。
3 理解ObjectContext類
EDM被準(zhǔn)備后,我們可以對(duì)對(duì)象模型執(zhí)行CRUD操作。這種操作需要使用ObjectContext類。ObjectContext類是Entity Framework的主要對(duì)象。ObjectContext負(fù)責(zé)管理在EDM中的實(shí)體。這個(gè)類主要負(fù)責(zé):1)管理數(shù)據(jù)庫(kù)的連接;2)對(duì)CRUD操作提供支持;3)跟蹤對(duì)象模型使其更新到數(shù)據(jù)庫(kù),ObjectContext類中的SaveChanges方法可以將新的或者改變的對(duì)象保存到數(shù)據(jù)庫(kù)。
還有另外一個(gè)類名為DbContext非常類似于ObjectContext類。DbContext類只是對(duì)ObjectContext類的一個(gè)包裹器。ObjectContext不是最新的類,DbContext類對(duì)于數(shù)據(jù)庫(kù)連接的管理和執(zhí)行CRUD操作都是較好的API。
4 Entity Framework的開(kāi)發(fā)風(fēng)格
一些項(xiàng)目的開(kāi)發(fā)都是分為數(shù)據(jù)庫(kù)和應(yīng)用程序兩個(gè)開(kāi)發(fā)部分,通常首先設(shè)計(jì)數(shù)據(jù)庫(kù),完成后才開(kāi)始應(yīng)用程序的開(kāi)發(fā)。但是根據(jù)需求分析的要求,應(yīng)用程序的開(kāi)發(fā)通常都是要求首先建立概念域模型,數(shù)據(jù)庫(kù)的表的建立是通過(guò)概念域模型來(lái)建立的,最后應(yīng)用程序?qū)?shí)現(xiàn)響應(yīng)的業(yè)務(wù)邏輯。還有一種可能性是,創(chuàng)建的應(yīng)用程序是高度以領(lǐng)域?yàn)橹行?,域模型通過(guò)類來(lái)實(shí)現(xiàn),數(shù)據(jù)庫(kù)只是用來(lái)維持這些模型的關(guān)系。
Entity Framework提供了對(duì)以上場(chǎng)景的不同的支持??梢詫⑵浞譃槿N不同的方法。1)數(shù)據(jù)庫(kù)優(yōu)先(DataBase First);2)代碼優(yōu)先(Code First);3)模型優(yōu)先(Model First)。應(yīng)該根據(jù)具體開(kāi)發(fā)場(chǎng)景的分析,權(quán)衡選擇哪一種方法。
4.1 數(shù)據(jù)庫(kù)優(yōu)先
數(shù)據(jù)庫(kù)優(yōu)先的方法,主要好處是一旦數(shù)據(jù)庫(kù)被創(chuàng)建好了,開(kāi)發(fā)人員將花比較少的時(shí)間來(lái)編寫(xiě)數(shù)據(jù)訪問(wèn)層。EDM能夠從數(shù)據(jù)庫(kù)來(lái)創(chuàng)建,并且可以根據(jù)程序的需要來(lái)改變。滿足的使用數(shù)據(jù)庫(kù)優(yōu)先的條件有:1)數(shù)據(jù)庫(kù)已經(jīng)創(chuàng)建完成了,或者在已有的數(shù)據(jù)上進(jìn)行開(kāi)發(fā);2)應(yīng)用程序是以數(shù)據(jù)為中心的,應(yīng)用程序的改變是否基于數(shù)據(jù)庫(kù)頻繁的改變而改變。
4.2 代碼優(yōu)先
代碼優(yōu)先的方法通常被用于業(yè)務(wù)邏輯類已經(jīng)被建立好了,數(shù)據(jù)庫(kù)只是簡(jiǎn)單的被用來(lái)提供數(shù)據(jù)持久的作用。滿足的使用代碼優(yōu)先的條件有:1)模型類已經(jīng)創(chuàng)建好了,只是想通過(guò)數(shù)據(jù)庫(kù)來(lái)進(jìn)行數(shù)據(jù)的持久化;2)需要完成模型類之后才考慮是否需要將數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù);3)開(kāi)發(fā)人員不喜歡生成類而更加偏愛(ài)編寫(xiě)類。
4.3 模型優(yōu)先
模型優(yōu)先的方法,可以創(chuàng)建概念模型來(lái)創(chuàng)建數(shù)據(jù)庫(kù),之所以使用這種方法的原因是:在Visual Studio中使用模型優(yōu)先的方式可以通過(guò)Visual Entity Designer來(lái)進(jìn)行EDM的創(chuàng)建。
5 通過(guò)LINQ to Entities查詢實(shí)體數(shù)據(jù)模型
LINQ(Language-Integrated Query)是.NET Framework中的數(shù)據(jù)查詢技術(shù)。LINQ to Entities是對(duì)應(yīng)用程序使用LINQ去指定需要獲得的數(shù)據(jù)的實(shí)體對(duì)象模型作了一個(gè)良好的抽象,LINQ to Entities提供者負(fù)責(zé)處理訪問(wèn)數(shù)據(jù)庫(kù)和為應(yīng)用程序獲取需要的數(shù)據(jù)。當(dāng)應(yīng)用程序使用LINQ to Entities去執(zhí)行LINQ查詢實(shí)體數(shù)據(jù)模型,LINQ首先在編譯時(shí)決定需要獲取哪些數(shù)據(jù),然后,它將被執(zhí)行,結(jié)果返回為CLR對(duì)象。然而,如果想理解整個(gè)過(guò)程,關(guān)鍵是理解被執(zhí)行的查詢和獲取.NET對(duì)象的結(jié)果。
大體的查詢過(guò)程是:應(yīng)用程序創(chuàng)建LINQ查詢;LINQ to Entities依賴能夠工作在Entity Framework概念對(duì)象模型的EntityClient,使用Entity Framework的對(duì)象實(shí)體模型將EntityClient命令轉(zhuǎn)換為SQL查詢;SQL查詢通過(guò)ADO.NET被傳遞到數(shù)據(jù)庫(kù);在數(shù)據(jù)庫(kù)中執(zhí)行查詢;查詢結(jié)果返回到Entity Framework;Entity Framework將結(jié)果轉(zhuǎn)換為CLR類型域?qū)嶓w;EntitiyClient將使用投影將需要的結(jié)果返回給應(yīng)用程序。
6 通過(guò)Entity SQL查詢對(duì)象模型
Entity SQL(ESQL)提供了類似于SQL的語(yǔ)法,可以去編寫(xiě)針對(duì)模型類而不是針對(duì)數(shù)據(jù)表的查詢。雖然,當(dāng)涉及實(shí)體數(shù)據(jù)模型的查詢時(shí)ESQL是一個(gè)很少使用技術(shù),但是,當(dāng)涉及對(duì)數(shù)據(jù)模型執(zhí)行動(dòng)態(tài)查詢時(shí)它卻十分有用。另一個(gè)使用ESQL的好處是開(kāi)發(fā)人員只需要知道實(shí)體數(shù)據(jù)模型的架構(gòu),而不需要知道數(shù)據(jù)庫(kù)的架構(gòu)。如果開(kāi)發(fā)人員比較熟悉SQL語(yǔ)言,那么使用ESQL將是十分容易的事情。
如果開(kāi)發(fā)人員使用ObjectQuery去編寫(xiě)ESQL,查詢將被執(zhí)行在對(duì)象層,也就是ESQL將獲得實(shí)體模型。相比之下,如果開(kāi)發(fā)人員使用EntityCommand去編寫(xiě)ESQL,查詢將執(zhí)行EntityClient,會(huì)獲得只讀的數(shù)據(jù)行集合。
7 總結(jié)
本文討論了ORM和通過(guò)ORM輕松地完成數(shù)據(jù)訪問(wèn)代碼。并討論了Entity Framework是如何工作的,以及Entity Framework實(shí)現(xiàn)的三種方法,并且為不同的場(chǎng)景該如何選擇哪種方法做了一些討論。還闡述了LINQ to Entities如何查詢實(shí)體數(shù)據(jù)模型和Entity SQL如何去查詢實(shí)體數(shù)據(jù)模型。還了解了Entity SQL在ObjectQuery和EntityCommand兩種情況下獲得數(shù)據(jù)的方式。本文只是對(duì)Entity Framework常用特性作了概述,由于篇幅所限,沒(méi)有對(duì)Entity Framework進(jìn)行代碼舉例,還有一些高級(jí)特性,諸如并發(fā)管理和事務(wù)管理等知識(shí)未涉及到。既是對(duì)知識(shí)的拾遺也為拋磚引玉之用。
參考文獻(xiàn):
[1] 百度百科.Entity Framework [EB/OL].http://baike.baidu.com/link?url=bEeKvfk_9KDdiPnZkjAHQlrkRKa6ls_fzakDi-Gqbs _HLddRw9GoSypehKGoSypehKNP2sGzRqjWetV3Mr W2K.
[2] 詹姆斯. ADO.NET 3.5高級(jí)編程:應(yīng)用LINQ&Entity Framework[M].孟兆煒 ,譯.北京:清華大學(xué)出版社,2012.