Entity Framework 概觀

Entity Framework 是一組 ADO.NET 技術,可支援資料導向軟體應用程式的開發。 資料導向應用程式的架構設計人員和開發人員經常致力於滿足達成兩個迥異目標的需求。 他們必須針對所解決之商務問題的實體、關聯性和邏輯建立模型,而且也必須使用用來儲存和擷取資料的資料引擎。 這項資料可能會跨越多個儲存系統,而且每個系統都有自己的通訊協定 (Protocol)。即使是使用單一儲存系統的應用程式都必須在儲存系統的需求與撰寫有效率和可維護應用程式程式碼的需求之間取得平衡。

Entity Framework 可讓開發人員以領域特定物件和屬性的形式處理資料,例如客戶和客戶位址,而不需要擔心此資料儲存所在的基礎資料庫資料表和資料行。 有了 Entity Framework,開發人員在處理資料時可以在較高的抽象層級工作,而且能夠使用比傳統應用程式更少的程式碼來建立及維護資料導向應用程式。 因為 Entity Framework 是.NET Framework的元件,所以 Entity Framework 應用程式可以在安裝從 3.5 版 SP1 開始.NET Framework的任何電腦上執行。

為模型提供生活

傳統且常見的建置應用程式或服務之設計方式是將應用程式或服務分成三個部分:領域模型、邏輯模型和實體模型。 網域模型會在建立模型的系統中定義實體和關聯性。 關聯式資料庫的邏輯模型會將實體和關聯性正規化成含有外部索引鍵條件約束的資料表。 實體模型會透過指定儲存詳細資料 (例如資料分割和索引),處理特定資料引擎的功能。

雖然資料庫管理員會調整實體模型來改善效能,不過撰寫應用程式程式碼的程式設計人員主要會透過撰寫 SQL 查詢和呼叫預存程序 (Stored Procedure),限制他們自己使用邏輯模型。 網域模型通常會當做擷取和傳達應用程式需求的工具使用,而經常當做在專案早期階段中檢視和討論,然後放棄的惰性圖表使用。 許多開發小組會略過建立概念模型,而從指定關聯式資料庫中的資料表、資料行和索引鍵開始。

Entity Framework 可讓開發人員查詢領域模型中的實體和關聯性,讓實體和關聯性成為模型, (在 Entity Framework 中稱為 概念 模型) ,同時依賴 Entity Framework 將這些作業轉譯為數據源特定的命令。 如此,應用程式便不再受限於特定資料來源的硬式編碼相依性。

使用 Code First 時,會將概念模型對應至程式碼中的儲存模型。 Entity Framework 可以根據您定義的物件類型和其他組態來推斷概念模型。 對應中繼資料會在執行階段產生,並以您定義網域類型的方式與您在程式碼中提供的其他組態資訊為基礎。 Entity Framework 會視需要根據中繼資料產生資料庫。 如需詳細資訊,請參閱 建立模型

使用實體資料模型工具時,概念模型、儲存體模型和兩者之間的對應會以 XML 架構的結構描述來表示,並定義於具有對應副檔名的檔案中。

  • 概念結構定義語言 (CSDL) 會定義概念模型。 CSDL 是 Entity Framework 的 實體資料模型實作。 副檔名是 .csdl。

  • 存放結構定義語言 (SSDL) 會定義儲存體模型,也稱為邏輯模型。 副檔名是 .ssdl。

  • 對應規格語言檔案 (MSL) 會定義儲存體模型和概念模型之間的對應。 副檔名是 .msl。

儲存體模型和對應可依需要變更,不需要變更概念模型、資料類別或應用程式程式碼。 由於儲存模型是提供者特有的,所以您可以在各種資料來源中使用一致的概念模型。

Entity Framework 會使用這些模型和對應檔案,針對概念模型中的實體和關聯性建立、讀取、更新和刪除作業,以對資料來源中的對等作業。 Entity Framework 甚至支援將概念模型中的實體對應至資料來源中的預存程式。 如需詳細資訊,請參閱 CSDL、SSDL 和 MSL 規格

將物件對應至資料

物件導向程式設計會提出與資料儲存系統互動的挑戰。 雖然類別的組織經常會與關聯式資料庫資料表的組織鏡像,但是這個符合並不完美。 多個正規化資料表經常會對應到單一類別,而且經常會使用與資料表之間的關聯性不同的方式來表示類別之間的關聯性。 例如,若要表示銷售訂單的客戶,Order 類別可能會使用包含 Customer 類別執行個體之參考的屬性,但是資料庫中的 Order 資料表資料列包含外部索引鍵資料行 (或資料行組),而且其值對應至 Customer 資料表中的主索引鍵值。 Customer 類別可能具有名為 Orders 的屬性,其中包含 Order 類別執行個體的集合,但是資料庫中的 Customer 資料表沒有任何可比較的資料行。 Entity Framework 可讓開發人員彈性地以這種方式表示關聯性,或更接近模型化關聯性,因為它們在資料庫中呈現。

現有的方案已經嘗試只將物件導向的類別和屬性對應至關聯式資料表和資料行,藉以填補這個間距 (經常稱為「阻抗不相符」)。 Entity Framework 不會採用這種傳統方法,而是將邏輯模型中的關聯式資料表、資料行和外鍵條件約束對應至概念模型中的實體和關聯性。 這樣做可以在定義物件和最佳化邏輯模型方面提供更大的彈性。 實體資料模型工具會根據概念模型產生可延伸的資料類別。 這些類別是可以使用開發人員所加入的其他成員所擴充的部分類別。 根據預設,針對特定概念模型所產生的類別會衍生自提供服務來將實體具體化為物件以及追蹤和儲存變更的基底類別 (Base Class)。 開發人員可以使用這些類別,將實體和關聯性當做經由關聯而相關的物件進行處理。 開發人員也可以自訂為概念模型產生的類別。 如需詳細資訊,請參閱 使用物件

存取和變更實體資料

Entity Framework 不只是另一個物件關聯式對應方案而已,它基本上是有關如何讓應用程式存取和變更表示成概念模型中之實體和關聯性的資料。 Entity Framework 會使用模型中的資訊和對應檔案,將概念模型中所表示之實體類型的物件查詢轉譯為數據源特定的查詢。 查詢結果會具體化為 Entity Framework 所管理的物件。 Entity Framework 提供下列方法來查詢概念模型並傳回物件:

  • LINQ to Entities。 提供Language-Integrated查詢 (LINQ) 支援,以查詢概念模型中定義的實體類型。 如需詳細資訊,請參閱LINQ to Entities

  • 實體SQL。 與儲存體無關的SQL方言,可直接與概念模型中的實體搭配使用,並支援實體資料模型概念。 實體SQL會與使用 EntityClient 提供者執行的物件查詢和查詢搭配使用。 如需詳細資訊,請參閱實體SQL概觀

Entity Framework 包含 EntityClient 資料提供者。 此提供者會管理連線、將實體查詢轉譯為數據源特定的查詢,並傳回 Entity Framework 用來將實體資料具體化為物件的資料讀取器。 當不需要物件具體化時,EntityClient 提供者也可以藉由讓應用程式執行 Entity SQL查詢並取用傳回的唯讀資料讀取器,來與標準 ADO.NET 資料提供者一樣使用。 如需詳細資訊,請參閱 適用於 Entity Framework 的 EntityClient 提供者

下圖說明用於處理資料的 Entity Framework 架構:

Entity Framework Architectural Diagram

實體資料模型工具可以產生衍生自 System.Data.Objects.ObjectContextSystem.Data.Entity.DbContext 的類別,代表概念模型中的實體容器。 這個物件內容會提供追蹤變更以及管理識別 (Identity)、並行和關聯性的機能。 這個類別也會公開 (Expose) 可針對資料來源進行寫入、插入、更新和刪除作業的 SaveChanges 方法。 就像查詢一樣,這些變更是由系統自動產生的命令所進行,或由開發人員指定的預存程序所進行。

資料提供者

提供者會 EntityClient 藉由存取概念實體和關聯性的資料來擴充 ADO.NET 提供者模型。 它會執行使用 Entity SQL的查詢。 實體SQL提供基礎查詢語言,可讓您 EntityClient 與資料庫通訊。 如需詳細資訊,請參閱 適用於 Entity Framework 的 EntityClient 提供者

Entity Framework 包含支援標準命令樹狀架構的更新 SqlClient Data Provider。 如需詳細資訊,請參閱 Entity Framework 的 SqlClient

實體資料模型工具

與 Entity Framework 執行時間一起,Visual Studio包含對應和模型化工具。 如需詳細資訊,請參閱 模型化和對應

深入了解

若要深入瞭解 Entity Framework,請參閱:

消費者入門- 提供如何使用快速入門快速啟動和執行的相關資訊,說明如何建立簡單的 Entity Framework 應用程式。

Entity Framework 術語 - 定義實體資料模型和 Entity Framework 所導入的許多詞彙,以及 Entity Framework 檔中所使用的詞彙。

Entity Framework 資源 - 提供概念性主題的連結,以及用於建置 Entity Framework 應用程式的外部主題和資源連結。

另請參閱