實(shí)體框架 是 ADO.NET中的一組支持開發(fā)面向數(shù)據(jù)的軟件應(yīng)用程序的技術(shù)。面向數(shù)據(jù)的應(yīng)用程序的架構(gòu)師和開發(fā)人員曾為實(shí)現(xiàn)兩個(gè)迥然不同的目標(biāo)費(fèi)盡心機(jī):他們必須為要解決的業(yè)務(wù)問(wèn)題的實(shí)體、關(guān)系和邏輯構(gòu)建模型,還必須處理用于存儲(chǔ)和檢索數(shù)據(jù)的數(shù)據(jù)引擎。數(shù)據(jù)可能跨多個(gè)各有不同協(xié)議的存儲(chǔ)系統(tǒng);甚至使用單個(gè)存儲(chǔ)系統(tǒng)的應(yīng)用程序也必須在存儲(chǔ)系統(tǒng)的要求與編寫高效且容易維護(hù)的應(yīng)用程序代碼之間取得平衡。
實(shí)體框架使開發(fā)人員可以采用特定于域的對(duì)象和屬性(如客戶和客戶地址)的形式使用數(shù)據(jù),而不必自己考慮存儲(chǔ)這些數(shù)據(jù)的基礎(chǔ)數(shù)據(jù)庫(kù)表和列。通過(guò)提升開發(fā)人員在處理數(shù)據(jù)時(shí)可以使用的抽象級(jí)別并減少創(chuàng)建和維護(hù)面向數(shù)據(jù)的應(yīng)用程序所需的代碼,可以實(shí)現(xiàn)這一目的。因?yàn)?實(shí)體框架 是 .NET Framework的一個(gè)組件,所以 實(shí)體框架 應(yīng)用程序可以在安裝了 .NET Framework 3.5 Service Pack 1 (SP1)的任何計(jì)算機(jī)上運(yùn)行。
為概念模型賦予生命
數(shù)據(jù)建模的一種由來(lái)已久且常見的設(shè)計(jì)模式是將數(shù)據(jù)模型分為三個(gè)部分:概念模型、邏輯模型和物理模型。概念模型定義要建模的系統(tǒng)中的實(shí)體和關(guān)系。關(guān)系數(shù)據(jù)庫(kù)的邏輯模型通過(guò)外鍵約束將實(shí)體和關(guān)系規(guī)范化到表中。物理模型通過(guò)指定分區(qū)和索引等存儲(chǔ)詳細(xì)信息實(shí)現(xiàn)特定數(shù)據(jù)引擎的功能。
物理模型由數(shù)據(jù)庫(kù)管理員進(jìn)行優(yōu)化以改善性能,而編寫應(yīng)用程序代碼的程序員的工作主要限制為通過(guò)編寫 SQL查詢和調(diào)用存儲(chǔ)過(guò)程來(lái)處理邏輯模型。概念模型通常用作捕獲和傳達(dá)應(yīng)用程序的要求的工具,常常以靜態(tài)關(guān)系圖的形式供項(xiàng)目早期階段查看和討論,隨后被棄用。許多開發(fā)團(tuán)隊(duì)會(huì)跳過(guò)概念模型的創(chuàng)建,直接從指定關(guān)系數(shù)據(jù)庫(kù)中的表、列和鍵開始工作。
實(shí)體框架可使開發(fā)人員查詢概念模型中的實(shí)體和關(guān)系,同時(shí)依賴于 實(shí)體框架將這些操作轉(zhuǎn)換為特定于數(shù)據(jù)源的命令,從而為概念模型賦予生命。這使應(yīng)用程序不再對(duì)特定數(shù)據(jù)源具有硬編碼的依賴性。概念模型、存儲(chǔ)模型以及兩個(gè)模型之間的映射以外部規(guī)范(稱為 實(shí)體數(shù)據(jù)模型(EDM))表示??梢愿鶕?jù)需要對(duì)存儲(chǔ)模型和映射進(jìn)行更改,而不需要對(duì)概念模型、數(shù)據(jù)類或應(yīng)用程序代碼進(jìn)行更改。存儲(chǔ)模型是特定于提供程序的,因此可以在各種數(shù)據(jù)源之間使用一致的概念模型。
EDM 由以下三種模型和具有相應(yīng)文件擴(kuò)展名的映射文件進(jìn)行定義。
-
概念架構(gòu)定義語(yǔ)言文件 (.csdl) -- 定義概念模型。
-
存儲(chǔ)架構(gòu)定義語(yǔ)言文件 (.ssdl) -- 定義存儲(chǔ)模型(又稱邏輯模型)。
-
映射規(guī)范語(yǔ)言文件 (.msl) -- 定義存儲(chǔ)模型與概念模型之間的映射。
實(shí)體框架 使用這些基于 XML 的模型和映射文件將對(duì)概念模型中的實(shí)體和關(guān)系的創(chuàng)建、讀取、更新和刪除操作轉(zhuǎn)換為數(shù)據(jù)源中的等效操作。EDM 甚至支持將概念模型中的實(shí)體映射到數(shù)據(jù)源中的存儲(chǔ)過(guò)程。有關(guān)更多信息,請(qǐng)參見 實(shí)體框架中的數(shù)據(jù)建模。
將對(duì)象映射到數(shù)據(jù)
面向?qū)ο蟮木幊虒?duì)與數(shù)據(jù)存儲(chǔ)系統(tǒng)的交互提出了一個(gè)難題。雖然類的組織通??杀容^接近地反映出關(guān)系數(shù)據(jù)庫(kù)表的組織,但是擬合程度并不完美。多個(gè)規(guī)范化表通常對(duì)應(yīng)于單個(gè)類,類之間的關(guān)系并未按照表之間的關(guān)系一樣表示。例如,若要表示某個(gè)銷售訂單的客戶,一個(gè) Order 類可使用包含對(duì) Customer 類實(shí)例的引用的屬性,但是數(shù)據(jù)庫(kù)中的一個(gè) Order 表行包含的一個(gè)外鍵列(或列集)具有對(duì)應(yīng)于 Customer 表中的主鍵值的值。一個(gè) Customer 類可以具有名為 Orders 的屬性,該屬性包含 Order 類的實(shí)例的集合,但是數(shù)據(jù)庫(kù)中的 Customer 表不包含相應(yīng)的列。
現(xiàn)有解決方案只能通過(guò)將面向?qū)ο蟮念惡蛯傩杂成涞疥P(guān)系表和列來(lái)嘗試彌合這種通常稱為“阻抗不匹配”的差異。實(shí)體框架沒(méi)有采用這種傳統(tǒng)方法,而是將邏輯模型中的關(guān)系表、列和外鍵約束映射到概念模型中的實(shí)體和關(guān)系。這在定義對(duì)象和優(yōu)化邏輯模型方面都增加了靈活性。實(shí)體數(shù)據(jù)模型工具基于概念模型生成可擴(kuò)展數(shù)據(jù)類。這些類是分部類,可以通過(guò)開發(fā)人員添加的其他成員進(jìn)行擴(kuò)展。為特定概念模型生成的類派生自一些基類,這些基類提供對(duì)象服務(wù)以將實(shí)體具體化為對(duì)象以及跟蹤和保存更改。開發(fā)人員可以使用這些生成的類以由導(dǎo)航屬性關(guān)聯(lián)起來(lái)的對(duì)象的形式來(lái)處理實(shí)體和關(guān)系。有關(guān)對(duì)象服務(wù)的更多信息,請(qǐng)參見對(duì)象服務(wù)概述(實(shí)體框架)。
訪問(wèn)和更改實(shí)體數(shù)據(jù)
實(shí)體框架不僅僅是另一種對(duì)象關(guān)系映射解決方案,還從根本上使應(yīng)用程序可以訪問(wèn)和更改表示為概念模型中的實(shí)體和關(guān)系的數(shù)據(jù)。對(duì)象服務(wù)使用 EDM將對(duì)概念模型中所表示的實(shí)體類型的對(duì)象查詢轉(zhuǎn)換為特定于數(shù)據(jù)源的查詢。查詢結(jié)果具體化為對(duì)象服務(wù)管理的對(duì)象。實(shí)體框架 提供以下方式用于查詢 EDM并返回對(duì)象:
-
LINQ to Entities -- 提供語(yǔ)言集成查詢 (LINQ) 支持用于查詢?cè)诟拍钅P椭卸x的實(shí)體類型。有關(guān)更多信息,請(qǐng)參見 LINQ to Entities 概述。
-
Entity SQL -- 與存儲(chǔ)無(wú)關(guān)的 SQL 方言,直接使用概念模型中的實(shí)體并支持諸如繼承和關(guān)系等 EDM 功能。Entity SQL 可用于對(duì)象查詢和使用 EntityClient 提供程序執(zhí)行的查詢。有關(guān)更多信息,請(qǐng)參見 Entity SQL 概述。
-
查詢生成器方法 -- 使您可以使用 LINQ 風(fēng)格的查詢方法構(gòu)造 Entity SQL 查詢。有關(guān)更多信息,請(qǐng)參見查詢生成器方法(實(shí)體框架)。
實(shí)體框架 中包含 EntityClient數(shù)據(jù)提供程序。此提供程序管理連接,將實(shí)體查詢轉(zhuǎn)換為特定于數(shù)據(jù)源的查詢,并返回一個(gè)由對(duì)象服務(wù)用來(lái)將實(shí)體數(shù)據(jù)具體化為對(duì)象的數(shù)據(jù)讀取器。當(dāng)不需要對(duì)象具體化時(shí),通過(guò)使應(yīng)用程序執(zhí)行 Entity SQL 查詢并使用返回的只讀數(shù)據(jù)讀取器,還可以像標(biāo)準(zhǔn) ADO.NET 數(shù)據(jù)提供程序一樣使用EntityClient 提供程序。有關(guān)更多信息,請(qǐng)參見 用于實(shí)體框架的 EntityClient 提供程序。
下圖演示用于訪問(wèn)數(shù)據(jù)的實(shí)體框架體系結(jié)構(gòu):

實(shí)體框架 生成一個(gè)從 ObjectContext 派生的類,該類表示概念模型中的實(shí)體容器。此對(duì)象上下文提供跟蹤更改以及管理標(biāo)識(shí)、并發(fā)和關(guān)系的功能。此類還公開將插入、更新和刪除操作寫入數(shù)據(jù)源的 SaveChanges 方法。與查詢類似,這些更改是由系統(tǒng)自動(dòng)生成的命令或由開發(fā)人員指定的存儲(chǔ)過(guò)程執(zhí)行的。有關(guān)更多信息,請(qǐng)參見添加、修改和刪除對(duì)象(實(shí)體框架)。
實(shí)體數(shù)據(jù)模型工具
除了 實(shí)體框架 運(yùn)行庫(kù)以外,.NET Framework 3.5 SP1 還包含 EDM 生成器(EdmGen.exe)。該命令提示實(shí)用工具連接到數(shù)據(jù)源并基于實(shí)體與表之間的一對(duì)一映射生成 EDM。另外,該實(shí)用工具還使用概念模型文件(.csdl) 生成一個(gè)對(duì)象層文件,該文件包含表示實(shí)體類型和 ObjectContext 的類。有關(guān)更多信息,請(qǐng)參見 EDM 生成器 (EdmGen.exe)。
Visual Studio 2008 為在 Visual Studio 應(yīng)用程序中生成和維護(hù) EDM提供了豐富的工具支持。實(shí)體數(shù)據(jù)模型設(shè)計(jì)器支持創(chuàng)建高級(jí)映射方案,如每種類型一個(gè)表和每個(gè)層次結(jié)構(gòu)一個(gè)表繼承以及映射到多個(gè)表的拆分實(shí)體。有關(guān)更多信息,請(qǐng)參見 ADO.NET 實(shí)體數(shù)據(jù)模型設(shè)計(jì)器概述。
了解更多信息
通過(guò)以下主題可以了解有關(guān) 實(shí)體框架 的更多信息:
- 入門(實(shí)體框架)
提供有關(guān)如何使用快速入門(實(shí)體框架)(演示如何創(chuàng)建簡(jiǎn)單的 實(shí)體框架 應(yīng)用程序)快速學(xué)習(xí)和掌握該組件的信息。
- 快速入門(實(shí)體框架)
演示如何將 實(shí)體數(shù)據(jù)模型 工具用于 Visual Studio 2008 以快速創(chuàng)建您的第一個(gè) 實(shí)體框架 應(yīng)用程序。
- 應(yīng)用程序方案(實(shí)體框架)
提供有關(guān)特定應(yīng)用程序方案的基于任務(wù)的主題鏈接,例如編寫查詢、將對(duì)象綁定到數(shù)據(jù)控件或?qū)崿F(xiàn)業(yè)務(wù)邏輯。
- 實(shí)體框架功能
提供有關(guān) 實(shí)體框架 中所含功能的更多詳細(xì)信息,以及討論這些功能的主題的鏈接。
- 實(shí)體框架術(shù)語(yǔ)
定義由 EDM 和 實(shí)體框架 引入以及在 實(shí)體框架 文檔中使用的許多術(shù)語(yǔ)。
- 實(shí)體框架資源
提供指向概念性主題的鏈接以及有關(guān)構(gòu)建 實(shí)體框架 應(yīng)用程序的外部主題和資源的鏈接。