麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

重新認(rèn)識了下Entity Framework

2019-11-10 20:14:51
字體:
供稿:網(wǎng)友

http://www.cnblogs.com/Erik_Xu/p/6017144.html

什么是Entity Framework

  Entity Framework是一個對象關(guān)系映射O/RM框架。

  Entity Framework讓開發(fā)者可以像操作領(lǐng)域?qū)ο?domain-specific objects)那樣操作關(guān)系型數(shù)據(jù)(relational data)。

  Entity Framework減少了大部分通常需要編寫的數(shù)據(jù)操作代碼。

  Entity Framework中可以使用LINQ來查詢數(shù)據(jù),使用強類型(strongly typed objects)來檢索和操作數(shù)據(jù)。

  Entity Framework提供了以下服務(wù),使開發(fā)者可以更加側(cè)重于程序業(yè)務(wù)邏輯,而非數(shù)據(jù)訪問的基本操作。

  1. 狀態(tài)或變更跟蹤(change tracking)

  2. 身份或主鍵識別(identity resolution)

  3. 懶加載(lazy loading)

  4. 查詢翻譯(query translation)

  Entity Framework是ADO.NET的加強,它給開發(fā)者提供了數(shù)據(jù)庫訪問和存儲的自動化機(jī)制。

  Entity Framework是一個開源框架。

 

什么是O/RM

  O/RM是一種工具,可以自動地把領(lǐng)域?qū)ο髷?shù)據(jù)存儲到關(guān)系型數(shù)據(jù)庫(如MS SQL Server),而不需要大量的編碼。

  O/RM包含三個重要的部分:

  1. 領(lǐng)域?qū)ο?Domain class objects):我們定義的類。

  2. 關(guān)系型數(shù)據(jù)庫對象(Relational database objects):數(shù)據(jù)庫表,視圖,存儲過程等。

  3. 映射信息(Mapping information):領(lǐng)域?qū)ο笈c關(guān)系型數(shù)據(jù)庫對象之間轉(zhuǎn)換的信息。

  O/RM允許開發(fā)者把數(shù)據(jù)庫設(shè)計和領(lǐng)域?qū)ο笤O(shè)計獨立開,讓程序更具有可維護(hù)性和可擴(kuò)展性。

  它還提供了基本的增刪改查的功能,開發(fā)者不需要手動再編寫這部分代碼。

  一個典型的數(shù)據(jù)庫與應(yīng)用程序的O/RM交互如下圖所示:

  

 

Entity Framework的結(jié)構(gòu)

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

  

 

  EDM(Entity Data Model):EDM包含三個主要的部分 - 概念模型(Conceptual model)、存儲模型(Storage model)和映射(Mapping)。

  1. Conceptual model:概念模型包含了模型的類定義,以及類之間的關(guān)系。概念模型的設(shè)計獨立于數(shù)據(jù)庫表設(shè)計。

  2. Storage model:存儲模型是數(shù)據(jù)庫設(shè)計模型,包含了數(shù)據(jù)庫表,視圖,存儲過程,以及它們的之間的關(guān)系和鍵。

  3. Mapping:映射包含了概念模型映射到存儲模型的相關(guān)信息。

  LINQ to Entities:一種基于對象模型編寫的查詢語言,它將返回概念模型中設(shè)計的實體。

  Entity SQL:另一種和LINQ to Entities相似的查詢語言,但是它們還是有一些差異的,開發(fā)者還是需要單獨花時間去學(xué)習(xí)它。

  Object Service:數(shù)據(jù)庫數(shù)據(jù)訪問的主要入口,主要職責(zé)是物化(materialization),把Entity Client Data PRovider返回的數(shù)據(jù)轉(zhuǎn)換成實體對象結(jié)構(gòu)。 

  Entity Client Data Provider:把LINQ to Entities或Entity SQL轉(zhuǎn)換成數(shù)據(jù)庫SQL。和ADO.Net Data Provider進(jìn)行通訊,發(fā)送或檢索數(shù)據(jù)庫數(shù)據(jù)。

  ADO.Net Data Provider:ADO.Net Data Provider使用標(biāo)準(zhǔn)的ADO.Net和數(shù)據(jù)庫進(jìn)行交互。

 

Entity Framework的開發(fā)模式

  Entity Framework提供了三種開發(fā)模式:

  1. Code First

  2. Database First

  3. Model First

  

  Code First:

  

  在Code First的開發(fā)模式中,要避免使用視覺模型設(shè)計器(EDMX),一般是先編寫POCO類,然后根據(jù)這些類去生成數(shù)據(jù)庫。

  那些遵循領(lǐng)域驅(qū)動開發(fā)(DDD)原則的開發(fā)者,更傾向于一開始先編寫自己的領(lǐng)域類,然后再生成數(shù)據(jù)庫來實現(xiàn)數(shù)據(jù)持久化。

 

  Database First:

   

  通過已有的數(shù)據(jù)庫來生成EDMX(Entity Data Model)的開發(fā)模式就是Database First的開發(fā)模式。

  如果數(shù)據(jù)庫變更了,EDMX(Entity Data Model)也會更新。同時,Database First也支持存儲過程,視圖等。

 

  Model First:

   

  Model First是Code First和Database First的一種折中開發(fā)模式,它提供視覺模型設(shè)計器(EDMX)來設(shè)計數(shù)據(jù)模型,然后根據(jù)數(shù)據(jù)庫模型來生成數(shù)據(jù)庫以及領(lǐng)域類。

  

  總結(jié):

  1. Code First是先編寫領(lǐng)域類,然后根據(jù)類來生成數(shù)據(jù)庫,無視覺模型設(shè)計器(EDMX)。

  2. Database First是根據(jù)數(shù)據(jù)庫生成視覺模型設(shè)計器(EDMX)及領(lǐng)域類。

  3. Model First是先生成視覺模型設(shè)計器(EDMX),然后根據(jù)EDMX生成數(shù)據(jù)庫及領(lǐng)域類。

 

選擇Entity Framework開發(fā)模式

  

  1. 如果你有一個現(xiàn)成的程序,并且已經(jīng)定義了領(lǐng)域類,那么,可以使用Code First的開發(fā)模式來生成數(shù)據(jù)庫進(jìn)行開發(fā)。

  2. 如果你有已個現(xiàn)成的數(shù)據(jù)庫,那么,可以使用Database First的開發(fā)模式來生成EDM進(jìn)行開發(fā)。

  3. 如果你沒有現(xiàn)成的數(shù)據(jù)庫,也沒有定義好的領(lǐng)域類,而你更傾向于使用圖形化界面來設(shè)計數(shù)據(jù)庫模型,那么,可以使用Model First的開發(fā)模式進(jìn)行開發(fā)。

  我個人的話,任何情景都會使用Code First的開發(fā)模式,因為它比較靈活,但是對開發(fā)者本身的要求會更高一些。

  

DbContext

  

  DbContext是Entity Framework的一個重要部分,它是領(lǐng)域或?qū)嶓w類與數(shù)據(jù)庫之間的橋梁。

  DbContext是一個很重要的類,主要職責(zé)是以對象的方式和數(shù)據(jù)進(jìn)行交互,它包含以下活動:

  EntitySet:DbContext包含實體集合(DbSet<TEntity>),把實體映射到數(shù)據(jù)庫表。

  Querying:DbContext把LINQ to Entities查詢轉(zhuǎn)換成SQL查詢,并發(fā)送到數(shù)據(jù)庫。

  Change Tracking:DbContext會跟蹤從數(shù)據(jù)庫查詢出來的實體的狀態(tài)變更。

  Persisting Data:DbContext根據(jù)實體的狀態(tài)提供插入,更新和刪除等數(shù)據(jù)庫操作。

  Caching:DbContext默認(rèn)實現(xiàn)一級緩存,在Context類的生命周期期間,它會保存檢索出來的實體。

  Manage Relationship:Database First或Model First中,使用CSDL,MSL,SSDL來管理關(guān)系,在Code First中使用Fluent API來管理關(guān)系。

  Object Materialization:DbContext把表原始數(shù)據(jù)轉(zhuǎn)換成實體對象。

  

實體生命周期

  在實體的生命期中,每個實體都有一個基于上下文(DbContext)的操作的實體狀態(tài)。

  實體狀態(tài)是一個System.Data.Entity.EntityState類型的枚舉,它包含以下的值:

  Added:實體正在被上下文跟蹤,但還不存在于數(shù)據(jù)庫中。

  Deleted:實體正在被上下文跟蹤并存在于數(shù)據(jù)庫,但被標(biāo)記為從數(shù)據(jù)庫刪除。

  Modified:實體正在被上下文跟蹤并存在于數(shù)據(jù)庫,而且實體的一些或所有屬性的值被修改了。

  Unchanged:實體正在被上下文跟蹤并存在于數(shù)據(jù)庫,但實體的所有屬性值都沒被修改。

  Detached:實體不被上下文跟蹤。

 

  下圖說明了實體狀態(tài)如何影響數(shù)據(jù)庫操作。

   

 

  1. 新的實體具有Added的狀態(tài),DbContext后續(xù)會在數(shù)據(jù)庫中執(zhí)行插入操作。

  2. 通過LINQ檢索出來的實體具有Unchanged的狀態(tài),但如果調(diào)用了AsNoTracking()方法,其狀態(tài)為Detached。

  3. 修改了檢索出來的實體的屬性值,實體會修改狀態(tài)為Modified,DbContext后續(xù)會在數(shù)據(jù)庫中執(zhí)行更新操作。

  4. 需要刪除的實體會具有Deleted的狀態(tài),DbContext后續(xù)會在數(shù)據(jù)庫中執(zhí)行刪除操作。

  5. 對于DbContext中已有的實體,可以通過dbContext.Entry(entity).State = EntityState.Detached的方式把狀態(tài)設(shè)置為Detached。

 

Entity Framework版本

版本

引入功能

EF 3.5

Database First模式下基本的O/RM支持。

EF 4.0

POCO的支持, 懶加載, 可測試性提升,定制化代碼生成,以及引入Model First開發(fā)模式。

EF 4.1

在ObjectContext的基礎(chǔ)上簡化了DBContext API,引入Code First開發(fā)模式。

EF 4.3

引入Code First Migrations,可以根據(jù)定義的Code First模型來創(chuàng)建或修改數(shù)據(jù)庫。

EF 5.0

宣布EF為開源項目。引入了枚舉支持,表值函數(shù), 空間數(shù)據(jù)類型,模型多圖表,設(shè)計界面著色形狀,批量導(dǎo)入存儲過程,EF Power Tools,以及各種性能提升。

EF 6.0

引入了許多Code First & EF設(shè)計相關(guān)的新功能,如異步操作(asynchronous),彈性連接(connection resiliency),依賴解析(dependency resolution)等。

注:Entity Framework Core不在本文討論范圍。

 

參考資料

本文大部分內(nèi)容來自:Entity Framework Tutorial

少量內(nèi)容參考:Entity Framework官網(wǎng)


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 午夜精品成人一区二区 | 黄视频网址 | 羞羞视频.www在线观看 | 亚洲国产精品久久久久婷婷老年 | 成人艳情一二三区 | 日本aaaa片毛片免费观看视频 | javhdfreejaⅴhd| 亚洲一级电影在线观看 | 欧美一区在线观看视频 | 久久亚洲精品国产 | 欧美一级特级 | 中文字幕欧美在线 | 日日狠狠久久偷偷四色综合免费 | 久久久久国产成人免费精品免费 | 久久经典国产视频 | 亚洲一区在线免费视频 | 欧美成人高清视频 | 91精品免费在线 | 永久免费黄色片 | 国产成人网 | 精品亚洲午夜久久久久91 | 青青操精品| 黄色网址入口 | 黄色网址免费进入 | 在线视频观看国产 | 久久久久免费电影 | 久久久婷婷一区二区三区不卡 | 91精品国| xxxx69hd一hd72| 欧美性生活xxxxx | 夜添久久精品亚洲国产精品 | av免费在线观看av | 精品国产一区二区三区在线观看 | 成人一级在线 | 午夜在线视频观看 | 欧美精品成人一区二区在线观看 | 久久久久免费精品 | 一区二区三区在线观看视频 | 92自拍视频| 男男羞羞视频网站国产 | 视频一区二区三区免费观看 |