Entity Framework是一個(gè)對(duì)象關(guān)系映射O/RM框架。
Entity Framework讓開(kāi)發(fā)者可以像操作領(lǐng)域?qū)ο?domain-specific objects)那樣操作關(guān)系型數(shù)據(jù)(relational data)。
Entity Framework減少了大部分通常需要編寫(xiě)的數(shù)據(jù)操作代碼。
Entity Framework中可以使用LINQ來(lái)查詢數(shù)據(jù),使用強(qiáng)類型(strongly typed objects)來(lái)檢索和操作數(shù)據(jù)。
Entity Framework提供了以下服務(wù),使開(kāi)發(fā)者可以更加側(cè)重于程序業(yè)務(wù)邏輯,而非數(shù)據(jù)訪問(wèn)的基本操作。
1. 狀態(tài)或變更跟蹤(change tracking)
2. 身份或主鍵識(shí)別(identity resolution)
3. 懶加載(lazy loading)
4. 查詢翻譯(query translation)
Entity Framework是ADO.NET的加強(qiáng),它給開(kāi)發(fā)者提供了數(shù)據(jù)庫(kù)訪問(wèn)和存儲(chǔ)的自動(dòng)化機(jī)制。
Entity Framework是一個(gè)開(kāi)源框架。
O/RM是一種工具,可以自動(dòng)地把領(lǐng)域?qū)ο髷?shù)據(jù)存儲(chǔ)到關(guān)系型數(shù)據(jù)庫(kù)(如MS SQL Server),而不需要大量的編碼。
O/RM包含三個(gè)重要的部分:
1. 領(lǐng)域?qū)ο?Domain class objects):我們定義的類。
2. 關(guān)系型數(shù)據(jù)庫(kù)對(duì)象(Relational database objects):數(shù)據(jù)庫(kù)表,視圖,存儲(chǔ)過(guò)程等。
3. 映射信息(Mapping information):領(lǐng)域?qū)ο笈c關(guān)系型數(shù)據(jù)庫(kù)對(duì)象之間轉(zhuǎn)換的信息。
O/RM允許開(kāi)發(fā)者把數(shù)據(jù)庫(kù)設(shè)計(jì)和領(lǐng)域?qū)ο笤O(shè)計(jì)獨(dú)立開(kāi),讓程序更具有可維護(hù)性和可擴(kuò)展性。
它還提供了基本的增刪改查的功能,開(kāi)發(fā)者不需要手動(dòng)再編寫(xiě)這部分代碼。
一個(gè)典型的數(shù)據(jù)庫(kù)與應(yīng)用程序的O/RM交互如下圖所示:

Entity Framework的總體結(jié)構(gòu)如下圖所示。

EDM(Entity Data Model):EDM包含三個(gè)主要的部分 - 概念模型(Conceptual model)、存儲(chǔ)模型(Storage model)和映射(Mapping)。
1. Conceptual model:概念模型包含了模型的類定義,以及類之間的關(guān)系。概念模型的設(shè)計(jì)獨(dú)立于數(shù)據(jù)庫(kù)表設(shè)計(jì)。
2. Storage model:存儲(chǔ)模型是數(shù)據(jù)庫(kù)設(shè)計(jì)模型,包含了數(shù)據(jù)庫(kù)表,視圖,存儲(chǔ)過(guò)程,以及它們的之間的關(guān)系和鍵。
3. Mapping:映射包含了概念模型映射到存儲(chǔ)模型的相關(guān)信息。
LINQ to Entities:一種基于對(duì)象模型編寫(xiě)的查詢語(yǔ)言,它將返回概念模型中設(shè)計(jì)的實(shí)體。
Entity SQL:另一種和LINQ to Entities相似的查詢語(yǔ)言,但是它們還是有一些差異的,開(kāi)發(fā)者還是需要單獨(dú)花時(shí)間去學(xué)習(xí)它。
Object Service:數(shù)據(jù)庫(kù)數(shù)據(jù)訪問(wèn)的主要入口,主要職責(zé)是物化(materialization),把Entity Client Data PRovider返回的數(shù)據(jù)轉(zhuǎn)換成實(shí)體對(duì)象結(jié)構(gòu)。
Entity Client Data Provider:把LINQ to Entities或Entity SQL轉(zhuǎn)換成數(shù)據(jù)庫(kù)SQL。和ADO.Net Data Provider進(jìn)行通訊,發(fā)送或檢索數(shù)據(jù)庫(kù)數(shù)據(jù)。
ADO.Net Data Provider:ADO.Net Data Provider使用標(biāo)準(zhǔn)的ADO.Net和數(shù)據(jù)庫(kù)進(jìn)行交互。
Entity Framework提供了三種開(kāi)發(fā)模式:
1. Code First
2. Database First
3. Model First
Code First:

在Code First的開(kāi)發(fā)模式中,要避免使用視覺(jué)模型設(shè)計(jì)器(EDMX),一般是先編寫(xiě)POCO類,然后根據(jù)這些類去生成數(shù)據(jù)庫(kù)。
那些遵循領(lǐng)域驅(qū)動(dòng)開(kāi)發(fā)(DDD)原則的開(kāi)發(fā)者,更傾向于一開(kāi)始先編寫(xiě)自己的領(lǐng)域類,然后再生成數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)數(shù)據(jù)持久化。
Database First:

通過(guò)已有的數(shù)據(jù)庫(kù)來(lái)生成EDMX(Entity Data Model)的開(kāi)發(fā)模式就是Database First的開(kāi)發(fā)模式。
如果數(shù)據(jù)庫(kù)變更了,EDMX(Entity Data Model)也會(huì)更新。同時(shí),Database First也支持存儲(chǔ)過(guò)程,視圖等。
Model First:

Model First是Code First和Database First的一種折中開(kāi)發(fā)模式,它提供視覺(jué)模型設(shè)計(jì)器(EDMX)來(lái)設(shè)計(jì)數(shù)據(jù)模型,然后根據(jù)數(shù)據(jù)庫(kù)模型來(lái)生成數(shù)據(jù)庫(kù)以及領(lǐng)域類。
總結(jié):
1. Code First是先編寫(xiě)領(lǐng)域類,然后根據(jù)類來(lái)生成數(shù)據(jù)庫(kù),無(wú)視覺(jué)模型設(shè)計(jì)器(EDMX)。
2. Database First是根據(jù)數(shù)據(jù)庫(kù)生成視覺(jué)模型設(shè)計(jì)器(EDMX)及領(lǐng)域類。
3. Model First是先生成視覺(jué)模型設(shè)計(jì)器(EDMX),然后根據(jù)EDMX生成數(shù)據(jù)庫(kù)及領(lǐng)域類。

1. 如果你有一個(gè)現(xiàn)成的程序,并且已經(jīng)定義了領(lǐng)域類,那么,可以使用Code First的開(kāi)發(fā)模式來(lái)生成數(shù)據(jù)庫(kù)進(jìn)行開(kāi)發(fā)。
2. 如果你有已個(gè)現(xiàn)成的數(shù)據(jù)庫(kù),那么,可以使用Database First的開(kāi)發(fā)模式來(lái)生成EDM進(jìn)行開(kāi)發(fā)。
3. 如果你沒(méi)有現(xiàn)成的數(shù)據(jù)庫(kù),也沒(méi)有定義好的領(lǐng)域類,而你更傾向于使用圖形化界面來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)模型,那么,可以使用Model First的開(kāi)發(fā)模式進(jìn)行開(kāi)發(fā)。
我個(gè)人的話,任何情景都會(huì)使用Code First的開(kāi)發(fā)模式,因?yàn)樗容^靈活,但是對(duì)開(kāi)發(fā)者本身的要求會(huì)更高一些。

DbContext是Entity Framework的一個(gè)重要部分,它是領(lǐng)域或?qū)嶓w類與數(shù)據(jù)庫(kù)之間的橋梁。
DbContext是一個(gè)很重要的類,主要職責(zé)是以對(duì)象的方式和數(shù)據(jù)進(jìn)行交互,它包含以下活動(dòng):
EntitySet:DbContext包含實(shí)體集合(DbSet<TEntity>),把實(shí)體映射到數(shù)據(jù)庫(kù)表。
Querying:DbContext把LINQ to Entities查詢轉(zhuǎn)換成SQL查詢,并發(fā)送到數(shù)據(jù)庫(kù)。
Change Tracking:DbContext會(huì)跟蹤從數(shù)據(jù)庫(kù)查詢出來(lái)的實(shí)體的狀態(tài)變更。
Persisting Data:DbContext根據(jù)實(shí)體的狀態(tài)提供插入,更新和刪除等數(shù)據(jù)庫(kù)操作。
Caching:DbContext默認(rèn)實(shí)現(xiàn)一級(jí)緩存,在Context類的生命周期期間,它會(huì)保存檢索出來(lái)的實(shí)體。
Manage Relationship:Database First或Model First中,使用CSDL,MSL,SSDL來(lái)管理關(guān)系,在Code First中使用Fluent API來(lái)管理關(guān)系。
Object Materialization:DbContext把表原始數(shù)據(jù)轉(zhuǎn)換成實(shí)體對(duì)象。
在實(shí)體的生命期中,每個(gè)實(shí)體都有一個(gè)基于上下文(DbContext)的操作的實(shí)體狀態(tài)。
實(shí)體狀態(tài)是一個(gè)System.Data.Entity.EntityState類型的枚舉,它包含以下的值:
Added:實(shí)體正在被上下文跟蹤,但還不存在于數(shù)據(jù)庫(kù)中。
Deleted:實(shí)體正在被上下文跟蹤并存在于數(shù)據(jù)庫(kù),但被標(biāo)記為從數(shù)據(jù)庫(kù)刪除。
Modified:實(shí)體正在被上下文跟蹤并存在于數(shù)據(jù)庫(kù),而且實(shí)體的一些或所有屬性的值被修改了。
Unchanged:實(shí)體正在被上下文跟蹤并存在于數(shù)據(jù)庫(kù),但實(shí)體的所有屬性值都沒(méi)被修改。
Detached:實(shí)體不被上下文跟蹤。
下圖說(shuō)明了實(shí)體狀態(tài)如何影響數(shù)據(jù)庫(kù)操作。

1. 新的實(shí)體具有Added的狀態(tài),DbContext后續(xù)會(huì)在數(shù)據(jù)庫(kù)中執(zhí)行插入操作。
2. 通過(guò)LINQ檢索出來(lái)的實(shí)體具有Unchanged的狀態(tài),但如果調(diào)用了AsNoTracking()方法,其狀態(tài)為Detached。
3. 修改了檢索出來(lái)的實(shí)體的屬性值,實(shí)體會(huì)修改狀態(tài)為Modified,DbContext后續(xù)會(huì)在數(shù)據(jù)庫(kù)中執(zhí)行更新操作。
4. 需要?jiǎng)h除的實(shí)體會(huì)具有Deleted的狀態(tài),DbContext后續(xù)會(huì)在數(shù)據(jù)庫(kù)中執(zhí)行刪除操作。
5. 對(duì)于DbContext中已有的實(shí)體,可以通過(guò)dbContext.Entry(entity).State = EntityState.Detached的方式把狀態(tài)設(shè)置為Detached。
版本 | 引入功能 |
EF 3.5 | Database First模式下基本的O/RM支持。 |
EF 4.0 | POCO的支持, 懶加載, 可測(cè)試性提升,定制化代碼生成,以及引入Model First開(kāi)發(fā)模式。 |
EF 4.1 | 在ObjectContext的基礎(chǔ)上簡(jiǎn)化了DBContext API,引入Code First開(kāi)發(fā)模式。 |
EF 4.3 | 引入Code First Migrations,可以根據(jù)定義的Code First模型來(lái)創(chuàng)建或修改數(shù)據(jù)庫(kù)。 |
EF 5.0 | 宣布EF為開(kāi)源項(xiàng)目。引入了枚舉支持,表值函數(shù), 空間數(shù)據(jù)類型,模型多圖表,設(shè)計(jì)界面著色形狀,批量導(dǎo)入存儲(chǔ)過(guò)程,EF Power Tools,以及各種性能提升。 |
EF 6.0 | 引入了許多Code First & EF設(shè)計(jì)相關(guān)的新功能,如異步操作(asynchronous),彈性連接(connection resiliency),依賴解析(dependency resolution)等。 |
注:Entity Framework Core不在本文討論范圍。
本文大部分內(nèi)容來(lái)自:Entity Framework Tutorial
少量?jī)?nèi)容參考:Entity Framework官網(wǎng)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注