EntityFramework
Entity Framework( 閣稱 ADO . NET Entity Framework ) 是微軟以 ADO . NET 為基礎所發展出來的物件關聯對應 ( O / R Mapping )解決方案,早期予人號做 ObjectSpace,包括佇 . NET Framework 中發表。對版本六開始獨立發佈。
背景
長久以來,程式設計師佮資料庫總是保持著一種微妙的關係,佇商用應用程式內底,資料庫一定是袂使欠的元件,這是予程式的設計師一定愛為著連接佮存取資料庫去學習 SQL 指令,啊因為按呢佇咧資訊業中間有足濟人攏咧研究講欲按怎共程式設計模型佮資料庫整合做伙,物件關聯對應 ( Object-Relational Mapping ) 伊的技術就是對這改來的,像 Hibernate 抑是 NHibernate 攏是這个技術下底的產物,煞無軟勢雖然有 ADO . NET 這个資料存取的利器,但是無講像 NHibernate 這款物件對應工具,就按呢微微仔軟軟佇 . NET Framework 二孵空發展時期,就提出一个 ObjectSpace 的概念,ObjectSpace 會當予應用程式會當用完全物件化的方法連接佮存取資料庫,其技術概念佮 NHibernate 相當的類似,毋過 ObjectSpace 工程誠大,佇咧 . NET Framework 二零完成時猶無法度全部完成,就按呢微微仔軟軟 ObjectSpace 納入後一版本的 . NET Framework 中,並且閣加一个設計的工具(Designer), 構成做這馬的 ADO . NET Entity Framework。
Entity Framework 是 ADO . NET 之上支援面向資料應用程式開發,予開發者工作佇領域相關的物件佮屬性的資料級,如客戶、客戶位址等等的,毋免關心儲存資料的底層表示、列。這種佇閣較懸層次的建立、維護面向資料的應用程式會當大大約編碼量。
Entity Framework 利用矣抽象化資料結構的方式,共每一个資料庫物件攏換做應用程式東西( entity ),啊若資料欄位攏轉換做屬性( property ),關聯著無換做結合屬性( association ),予資料庫的 E / R 模型完全的轉做物件模型,按呢予程式設計師會當用上熟似的程式語言來呼叫存取。抑若佇咧抽象化的結構之下,是懸度整合佮對應結構的概念層、對應層佮儲存層,閣有支援 Entity Framework 的資料提供者 ( provider ),予資料存取的工作會當順利佮完整的進行。
- 概念層:負責向頂懸的物件佮屬性顯露佮存取。
- 對應層:共頂頭的概念層佮下跤的儲存層的資料結構對應做伙。
- 儲存層:依照資料庫佮資料結構,才來顯露出實體的資料結構體,和 Provider 做伙的,負責實際對資料庫的存取佮 SQL 的產生。
歷史
二空空八年八月十一號,Entity Framework 的頭一版 ( EFv 一 ) 隨 . NET Framework 三人五 Service Pack 一和 Visual Studio 兩千空八 Service Pack 發佈。該版受著廣泛的批評。
二空一空四月十二號,Entity Framework 二版,這號做 Entity Framework 四配零 ( EFv 四 ) 發布,解決矣頭一版的足濟問題。該版本完全包括佇咧 . NET Framework 中。
二空一一年四月十二就發布矣 Entity Framework 第三个版本,這號做 version 四配一,開始支援 Code First。二空一一年七月二五發布矣 Entity Framework 四配一 Update 一。
二空一二年二月二九發布矣 version 四配三 . 一。
二空一二年八月十一號發布矣 Version 五曉空 . 零。佮 . NET framework 四配套。
二空一三年十月十七發布矣 Version 六板零。並成做開源軟體,使用 Apache License v 二 . 類似 ASP . NET MVC,開源發布 GitHub。This version has a number of improvements for code-first support . Entity Framework 六板零、六桱一、六桱二、六交三和六交四完全作為 NuGet 包提供。
二空一四年五月十九,微軟決定為著欲予伊 . NET 會當迒過平台,後一版 Entity Framework 欲完全重寫。二空一六年六月二十七號,發佈矣 Entity Framework Core 一垺零 , 伴隨著 ASP . NET Core 一孵零佮 . NET Core 一垺零 . 本來其號做 Entity Framework 七,但是為著欲突出其實是完全重寫毋是換 EF 六所以重號名。
架構
ADO . NET Entity Framework 架構,對底向頂懸包括:
- Data source specific providers, ADO . NET 抽象介面連接著資料庫。
- Map provider, 特定資料庫的 provider,就共翻譯 Entity SQL 命令樹仔到資料庫本地 SQL 方言查詢。包括講Store-specific bridge,負責共一般命令樹仔翻譯做儲存特定的命令樹仔。
- EDM parser and view mapping, 共資料模型的特定的 SDL 規範佮按怎對映著關係模型。對關係模式角度,伊建立矣伊對應該模型的資料 views。伊聚合(aggregate)濟張表的資訊成做一个實體(entity), 共一个到實體的修改(update)分割為著這个濟表的修改。
- Query and update pipeline, 處理查詢、過濾器、修改等等的請求,轉化做經典命令樹仔。
- Metadata services, 處理實體、關係、對映的所有元資料。
- Transactions, 整合基礎儲存的事務能力。若是基礎儉無支援事務,則佇這个層次上實現事務。
- Conceptual layer API, 提供概念模式下的編程介面。遵從 ADO . NET 模式,使用 Connection 東西參照 map provider , 使用 Command 物件傳送查詢,倒轉來 EntityResultSets 抑是 EntitySets 以包括結果。
- Disconnected components, ADO . NET Entity Framework 使用的本地緊取資料集佮實體集,有當時仔連接環境。
- Embedded database: ADO . NET Entity Framework 包含一个輕量死亡的資料庫是用佇客戶捀緊取佮查詢關聯式的資料庫。
- Design tools, 如 Mapping Designer , ADO . NET Entity Framework 包含著的對映對概念模式到關係模式,指出實體類型的佗一寡屬性對映到資料庫的佗一个表。
- Programming layer, 暴露 EDM 做編程結構,會當被程式語言使用
- Object services, 自動產生 CLR 類代碼,共仝一屬性做為一个實體,允准實體實例作為 . NET 東西 .
- Web services, 暴露 web 服務的實體
- High-level services, 若佇實體頂懸的報告服務。
概念層結構
概念層結構定義矣物件模型 ( Object Model ),予上層的應用程式碼會使如物件導向的方式般存取資料,概念層結構是由 CSDL ( Conceptual Schema Definition Language ) 所編寫。
一份概念層結構定義所示落所示:
對應層結構
對應層結構負責將上層的概念層結構佮下層的儲存體結構當中的成員結合做伙,確定資料的來源佮流向。對應層結構是由 MSL ( Mapping Specification Language ) 所編寫。
一份對應層結構定義所示落來:
儲存層結構
儲存層結構是負責佮資料庫管理系統(DBMS)中的資料表做實體對應 ( Physical Mapping ),予資料會當輸入正確的資料來源內底,或者是由正確的資料來源提出。伊是由 SSDL ( Storage Schema Definition Language ) 所編寫。
一份儲存層結構定義照落所示:
Entity Data Model
Entity Data Model(EDM) 予出資料的概念模型 ( CSDL ),這咧使用的建模技術予人叫做是 Entity Data Model , 是 _ 實體-模型有關係 _ 的擴充版。資料模型主要欲講著實體佮其涉及的關聯(Association)。 EDM 模式用 _ Schema Definition Language _ ( SDL ) 表述,這件代誌 XML 的一種應用。此外,對概念模式 ( CSDL ) 到儲存模式 ( SSDL ) 的對映 ( MSL ) 嘛著愛用 XML 表示。
Visual Studio 提供矣 _ Entity Designer _ 視覺化建立 EDM 佮對映規範。該工具輸出 XML 檔案 ( \ * . edmx ) 來講這款模式佮對映。Edmx 檔案包括 EF 元資料 ( CSDL / MSL / SSDL 內容 )。嘛會使手工編輯這三个檔案 ( csdl , msl , ssdl )。
Mapping
Visual Studio 的 Entity Data Model Wizard 佇咧大部份的情形下上起初產生資料庫模式佮概念模式的一對映。關係模式下,表佮主鍵、外來鍵組成元素。「實體類型」定義矣概念模式下的資料。
實體類型是百幾个類型欄位的聚合,每一个欄位對映著資料庫的特定列,會當包含來自濟个物理表的資訊。實體類型會當互相有關係,而且獨立於物理模式內底的關係。相關的實體會當通過欄位的名表示這種關係,以代替對資料庫的列取得值,通過這種欄位會當遍歷相關的實體,轉去一个實體抑是實體集合。
實體類型做物件的類型,實體是規个類型的實例。實體是應用程式的單個東西,用一个鍵索引。
ADO . NET Entity Framework 使用Entity Data Model( EDM ) 表示這款對映。
ADO . NET Entity Framework 使用 eSQL,SQL 的一个衍生,來執行查詢、集合論操作、修改實體佮其關係。
實體
實體是「實體類型」的實例,表示單一个物件的實例(如「客戶」、「 訂單」)。 ADO . NET Entity Framework 中的實體屬性是完全類型化的,完全相容於 DBMS 的型別系統佮 . NET Framework 的 Common Type System。屬性會當是 _ SimpleType _ 抑是 _ ComplexType _ 抑是偌值的。所有 _ EntityType _ 屬於某一个號名的空間,並包含一个 _ EntityKey _ 屬性。
所有實體實例佇咧 EntityContainers 中。每一个案有一个抑是幾个仔 EntityContainers。
EDM 基礎類型 ( 簡單類型 ) :
關係
任何兩个實體的類型會當是相關的,抑無就是 _ Association _ 關係抑是 _ Containment _ 關係。用 _ Relationship Type _ 來表示。
關係類型用 degree ( arity ) 和 multiplicity 刻畫。ADO . NET Entity Framework 支援兩箍雙向關係,multiplicity 包括一對一、一對外、濟嘿濟。實體間的關係是有名的,這號做 Role。定義矣關係的目的。
關係類型會當有 _ Operation _ 抑是 _ Action _。比如講,刪除一个實體,其實關係會當採取:
- Cascade:刪除關係實例佮所有相關聯的實體實例。
- None.
模式定義語言
ADO . NET Entity Framework 使用是因為 XML 的資料定義語言叫做 _ Schema Definition Language _ ( SDL ) 定義 EDM Schema。SDL 定義矣 SimpleTypes 類似 CTS 基礎類型,包括講 _ String _ , _ Int 三十二 _ , _ Double _ , _ Decimal _ , _ Guid _ , 和 _ DateTime _ 等咧。列舉類型定義了基礎值佮其名的對映,也予人認為是簡單類型。ComplexTypes 為其他類型的聚合。屬性的集合定義矣實體類型。寫做巴恩斯瑙爾範式:
_ Facets _ 用佇咧描述屬性的元資料,若準是毋是可空、預設值、為單值抑是濟值。
關係類型,親像客戶佮訂單是一對多關係。
查詢物件
ADO . NET 實體資料模型的工具會產生對 ObjectContext ( 代表概念模型中所定義的實體容器 ) 衍生來的類別。ObjectContext 類別支援針對共實體當做物件傳回之概念模型進行查詢,嘛支援建立、閣較新佮刣掉實體物件。Entity Framework 支援針對概念模型進行物件查詢。遮的查詢會當使用 Entity SQL、Language-Integrated Query ( LINQ ) 和物件查詢產生器方法來編寫。
Entity SQL
Entity Client 是 ADO . NET Entity Framework 中的原生使用者捀 ( Native Client )。伊的物件模型佮 ADO . NET 的其他使用者捀非常的相𫝛,原仔有 Connection , Command , DataReader 等等的東西,但是上大的精差就是,伊有家己的 SQL 指令 ( Entity SQL ),會用得 SQL 的方式存取 EDM。但是無明確的 _ joins _。簡單的講,就是共 EDM 當做一个實體資料庫。
查詢管線的分析 Entity SQL 查詢做一欉命令樹,query into a command tree , 分開真濟表上的查詢,才閣徙交 EntityClient provider。EntityClient provider 使用 _ Connection _ 物件初初化。EntityClient provider 閣共 Entity SQL 命令樹仔轉化做資料庫的本地 SQL 查詢。查詢倒轉來 Entity SQL ResultSet,但是無限一个表的結果。
Entity SQL 經典函式
Entity Framework 相容的 data providers 攏支援的函式,可用 Entity SQL 查詢。LINQ to Entities 的大部門擴充方法攏翻譯做經典函式。ADO . NET data provider 會共經典函式翻譯做向望的 SQL 語句。
LINQ to Entities
實作 IEnumerable < T > 泛型介面抑是 IQueryable < T > 泛型介面的資料來源會當透過 LINQ 進行查詢。實作泛型 IQueryable < T > 介面之泛型 ObjectQuery < T > 類別的執行個體會當做 LINQ to Entities 查詢的資料來源。ObjectQuery < T > 泛型類別表示傳回零个抑是真濟具型別物件之集合的查詢。使用 C # 的 var 關鍵字 ( 佇咧 Visual Basic 中為 Dim ),你嘛會當予編譯器推斷實體的類型。
查詢產生器方法
ObjectQuery 類別支援著概念模型進行 LINQ to Entities 和 Entity SQL 查詢。ObjectQuery 嘛會實際一組查詢產生器方法,遮的方法愛有循序的建構佮 Entity SQL 相等的查詢命令。因為 ObjectQuery 會做實作 IQueryable 和 IEnumerable,所以將 ObjectQuery 所實作的查詢產生器方法去結合 LINQ 特定的標準查詢運算子方法 ( 如 First 抑是 Count ) 這是會用得。LINQ 運算子並袂傳回 ObjectQuery,佮查詢產生器的方法無仝。
開發工具
目前 ADO . NET Entity Framework 的開發,佇咧 Visual Studio 二千空八中有充分的支援,咧安裝 Visual Studio 兩千空八 Service Pack 一後,檔案範本就會出現 ADO . NET 實體資料模型 ( ADO . NET Entity Data Model ) 會當予開發人員利用 Entity Model Designer 來設計 EDM,EDM 亦可由 Windows 記事本等文字編輯器所編輯。
衍生服務
微軟特別針對網路頂懸無仝款的應用程式(比如講 AJAX,Silverlight,Mashup 應用程式)開發一个是因為 ADO . NET Entity Framework 上的服務,這號做 ADO . NET Data Services(專案代號做Astoria), 並佮 ADO . NET Entity Framework 做伙包裝佇 . NET Framework 三人五 Service Pack 一中發表。
支援廠商
目前已經有幾若个資料庫廠商抑是元件開發商宣佈欲支援 ADO . NET Entity Framework :
- Mircosoft , 支援 MsSQL .
- Core Lab,支援 Oracle、MySQL、PostgreSQL 佮 SQLite 資料庫。
- IBM,實作 DB 二使用的 LINQ Provider。
- MySQL,發展 MySQL Server 所用的 Provider。
- Npqsql,發展 PostgreSQL 所用的 Provider。
- OpenLink Software,發展支援真濟資料庫咧用的 Provider。
- Phoenix Software International,發展支援 SQLite 資料庫的 Provider。
- Sybase,共支援 Anywhere 資料庫。
- VistaDB Software,共支援 VistaDB 資料庫。
- DataDirect Technologies,發展支援真濟資料庫咧用的 Provider。
- Firebird,支援 Firebird 資料庫。
參考資料
外部連結
- (英文)MSDN Library : ADO . NET Entity Framework
- (繁體中文)讀寫 ADO . NET Entity Framework
- (繁體中文)整合 ADO . NET Entity Framework 到應用程式當中
- (繁體中文)頭一改接觸的 ADO . NET Entity Framework
- (繁體中文)ADO . NET Entity Framework 概觀
- (英文)Recent ADO . NET Entity Framework provider news-Demos and downloads