重新認識了下Entity Framework
什麼是Entity Framework
Entity Framework
是一個物件關係對映O/RM
框架。
Entity Framework
讓開發者可以像操作領域物件(domain-specific objects)那樣操作關係型資料(relational data)。
Entity Framework
減少了大部分通常需要編寫的資料操作程式碼。
Entity Framework
中可以使用LINQ
來查詢資料,使用強型別(strongly typed objects)來檢索和運算元據。
Entity Framework
提供了以下服務,使開發者可以更加側重於程式業務邏輯,而非資料訪問的基本操作。
- 狀態或變更跟蹤(change tracking)
- 身份或主鍵識別(identity resolution)
- 懶載入(lazy loading)
- 查詢翻譯(query translation)
Entity Framework是ADO.NET
的加強,它給開發者提供了資料庫訪問和儲存的自動化機制。
Entity Framework是一個開源框架。
什麼是O/RM
O/RM是一種工具,可以自動地把領域物件資料儲存到關係型資料庫(如MS SQL Server),而不需要大量的編碼。
O/RM包含三個重要的部分:
領域物件(Domain class objects):我們定義的類。
關係型資料庫物件(Relational database objects):資料庫表,檢視,儲存過程等。
對映資訊(Mapping information):領域物件與關係型資料庫物件之間轉換的資訊。
O/RM允許開發者把資料庫設計和領域物件設計獨立開,讓程式更具有可維護性和可擴充套件性。
它還提供了基本的增刪改查的功能,開發者不需要手動再編寫這部分程式碼。
一個典型的資料庫與應用程式的O/RM互動如下圖所示:
Entity Framework的結構
Entity Framework的總體結構如下圖所示。
EDM(Entity Data Model):EDM包含三個主要的部分 - 概念模型(Conceptual model
)、儲存模型(Storage model
)和對映(Mapping
)。
Conceptual model
:概念模型包含了模型的類定義,以及類之間的關係。概念模型的設計獨立於資料庫表設計。Storage model
:儲存模型是資料庫設計模型,包含了資料庫表,檢視,儲存過程,以及它們的之間的關係和鍵。Mapping
:對映包含了概念模型對映到儲存模型的相關資訊。
LINQ to Entities:一種基於物件模型編寫的查詢語言,它將返回概念模型中設計的實體。
Entity SQL:另一種和LINQ to Entities相似的查詢語言,但是它們還是有一些差異的,開發者還是需要單獨花時間去學習它。
Object Service:資料庫資料訪問的主要入口,主要職責是物化(materialization),把Entity Client Data Provider返回的資料轉換成實體物件結構。
Entity Client Data Provider:把LINQ to Entities或Entity SQL轉換成資料庫SQL。和ADO.Net Data Provider進行通訊,傳送或檢索資料庫資料。
ADO.Net Data Provider:ADO.Net Data Provider
使用標準的ADO.Net
和資料庫進行互動。
Entity Framework的開發模式
Entity Framework
提供了三種開發模式:
Code First
Database First
Model First
Code First:
在Code First
的開發模式中,要避免使用視覺模型設計器(EDMX
),一般是先編寫POCO
類,然後根據這些類去生成資料庫。
那些遵循領域驅動開發(DDD)原則的開發者,更傾向於一開始先編寫自己的領域類,然後再生成資料庫來實現資料持久化。
Database First:
通過已有的資料庫來生成EDMX(Entity Data Model)
的開發模式就是Database First
的開發模式。
如果資料庫變更了,EDMX(Entity Data Model)
也會更新。同時,Database First
也支援儲存過程,檢視等。
Model First:
Model First
是Code First
和Database First
的一種折中開發模式,它提供視覺模型設計器(EDMX)來設計資料模型,然後根據資料庫模型來生成資料庫以及領域類。
總結:
Code First
是先編寫領域類,然後根據類來生成資料庫,無視覺模型設計器(EDMX)。Database First
是根據資料庫生成視覺模型設計器(EDMX)及領域類。Model First
是先生成視覺模型設計器(EDMX),然後根據EDMX生成資料庫及領域類。
選擇Entity Framework開發模式
1. 如果你有一個現成的程式,並且已經定義了領域類,那麼,可以使用Code First
的開發模式來生成資料庫進行開發。
如果你有已個現成的資料庫,那麼,可以使用
Database First
的開發模式來生成EDM進行開發。如果你沒有現成的資料庫,也沒有定義好的領域類,而你更傾向於使用圖形化介面來設計資料庫模型,那麼,可以使用
Model First
的開發模式進行開發。
我個人的話,任何情景都會使用Code First
的開發模式,因為它比較靈活,但是對開發者本身的要求會更高一些。
DbContext
DbContext
是Entity Framework
的一個重要部分,它是領域或實體類與資料庫之間的橋樑。
DbContext
是一個很重要的類,主要職責是以物件的方式和資料進行互動,它包含以下活動:
EntitySet
:DbContext
包含實體集合(DbSet<TEntity>
),把實體對映到資料庫表。
Querying
:DbContext
把LINQ to Entities
查詢轉換成SQL
查詢,併傳送到資料庫。
Change Tracking
:DbContext
會跟蹤從資料庫查詢出來的實體的狀態變更。
Persisting Data
:DbContext
根據實體的狀態提供插入,更新和刪除等資料庫操作。
Caching
:DbContext
預設實現一級快取,在Context
類的生命週期期間,它會儲存檢索出來的實體。
Manage Relationship
:Database First
或Model First
中,使用CSDL,MSL,SSDL來管理關係,在Code First
中使用Fluent API
來管理關係。
Object Materialization
:DbContext
把表原始資料轉換成實體物件。
實體生命週期
在實體的生命期中,每個實體都有一個基於上下文(DbContext
)的操作的實體狀態。
實體狀態是一個System.Data.Entity.EntityState
型別的列舉,它包含以下的值:
Added
:實體正在被上下文跟蹤,但還不存在於資料庫中。
Deleted
:實體正在被上下文跟蹤並存在於資料庫,但被標記為從資料庫刪除。
Modified
:實體正在被上下文跟蹤並存在於資料庫,而且實體的一些或所有屬性的值被修改了。
Unchanged
:實體正在被上下文跟蹤並存在於資料庫,但實體的所有屬性值都沒被修改。
Detached
:實體不被上下文跟蹤。
下圖說明了實體狀態如何影響資料庫操作。
1. 新的實體具有Added
的狀態,DbContext
後續會在資料庫中執行插入操作。
通過
LINQ
檢索出來的實體具有Unchanged
的狀態,但如果呼叫了AsNoTracking()
方法,其狀態為Detached
。修改了檢索出來的實體的屬性值,實體會修改狀態為
Modified
,DbContext
後續會在資料庫中執行更新操作。需要刪除的實體會具有
Deleted
的狀態,DbContext
後續會在資料庫中執行刪除操作。對於
DbContext
中已有的實體,可以通過dbContext.Entry(entity).State = EntityState.Detached
的方式把狀態設定為Detached
。
Entity Framework版本
版本 | 引入功能 |
---|---|
EF 3.5 | Database First 模式下基本的O/RM 支援。 |
EF 4.0 | POCO 的支援, 懶載入, 可測試性提升,定製化程式碼生成,以及引入Model First 開發模式。 |
EF 4.1 | 在ObjectContext 的基礎上簡化了DBContext API,引入Code First 開發模式。 |
EF 4.3 | 引入Code First Migrations ,可以根據定義的Code First 模型來建立或修改資料庫。 |
EF 5.0 | 宣佈EF為開源專案。引入了列舉支援,表值函式, 空間資料型別,模型多圖表,設計介面著色形狀,批量匯入儲存過程,EF Power Tools ,以及各種效能提升。 |
EF 6.0 | 引入了許多Code First & EF 設計相關的新功能,如非同步操作(asynchronous ),彈性連線(connection resiliency),依賴解析(dependency resolution )等。 |
注:Entity Framework Core不在本文討論範圍。
相關文章
- 6 歲!是時候重新認識下 Serverless 了Server
- 6歲!是時候重新認識下Serverless了Server
- Entity Framework(1)Framework
- Entity Framework Core 2.0 入門Framework
- Entity Framework版本歷史概覽Framework
- entity framework與ADO.NET 2.0效率Framework
- 【譯】Announcing Entity Framework Core 5.0 Preview 5FrameworkView
- 重新認識 React 生命週期React
- [Android]元件化-重新認識AndroidManifestAndroid元件化
- Entity Framework Core 2.1,新增種子資料Framework
- Entity Framework Core中的併發處理Framework
- 在Entity Framework中使用儲存過程Framework儲存過程
- .NET Framework 4.8 Web API+Entity Framework(實現增刪改查)FrameworkWebAPI
- 重新認識原型和原型鏈一原型
- 重新認識 async/await 語法糖AI
- 重新認識原型和原型鏈二原型
- 重新認識原型和原型鏈三原型
- 重新認識Docker Compose之Sidecar模式DockerIDE模式
- 重新認識受控和非受控元件元件
- 【視訊】Entity Framework Core 2.* 入門教程Framework
- 在Visual Studio 2013中配置Entity Framework使用MySQLFrameworkMySql
- 一次專案組聚餐,讓我重新認識了很多人
- 重新認識Java微服務架構-認證服務Java微服務架構
- 重新認識flex縮寫屬性—[flex]Flex
- Java 混淆那些事(一):重新認識 ProGuardJava
- Entity Framework使用DBContext實現增刪改查示例FrameworkContext
- 重新認識融雲,「不止即時通訊」
- 10、Entity Framework Core 3.1入門教程-執行原生SQLFrameworkSQL
- Vue會了嗎?來認識一下React吧(上)VueReact
- 重新認識React Native和Android的通訊原理React NativeAndroid
- 如何寫工程程式碼——重新認識物件導向物件
- Java小白進階筆記(1)-重新認識JavaJava筆記
- 在WebApi專案裡使用MiniProfiler並且分析 Entity Framework CoreWebAPIFramework
- 關於對Entity Framework Core3.1的理解與總結Framework
- 1、Entity Framework Core 3.1入門教程-概述和準備工作Framework
- .NET Core學習筆記(8)——Entity Framework Core之Database First筆記FrameworkDatabase
- .NET Core學習筆記(9)——Entity Framework Core之Code First筆記Framework
- 重新認識下:從程式設計師泥瓦匠到增長駭客子木程式設計師