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