首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

ADO.NET Entity Framework 入門:架構核心與兩種資料存取模式詳解

     編輯:關於.NET

前言

ADO.NET Entity Framework (EF) 是微軟推出的企業級 ORM 框架,透過實體資料模型 (EDM) 將資料庫結構抽象為概念模型,讓開發人員面向物件而非資料表進行開發。本文將為您拆解 EF 核心架構、關鍵術語,並詳細對比兩種基礎資料存取方式:EntityDataReader (類 ADO.NET) 與 ObjectContext/ObjectQuery (物件導向)。

一、 核心術語速查

術語全稱角色
LINQ to EntitiesLanguage Integrated Query to Entities強型別查詢語言,編譯期檢查,IntelliSense 支援
ESQLEntity SQL類 SQL 字串查詢,動態組裝,獨立於儲存引擎
EFADO.NET Entity Framework整體框架,包含映射、物件服務、查詢管線
EDMEntity Data Model實體資料模型:CSDL + SSDL + MSL
EntityEntity概念模型中的實體型別,具備身分識別 (Key)
CSDLConceptual Schema Definition Language定義實體、關聯、實體容器、集合
SSDLStore Schema Definition Language定義資料庫結構:資料表、欄位、鍵、關聯
MSLMapping Specification Language定義 CSDL 與 SSDL 之間的映射關係

二、 四層架構剖析

  1. Storage Provider (儲存提供者):直接與資料庫通訊 (SQL Server, Oracle 等),執行原生 SQL。
  2. Mapping Layer (映射層):處理 CSDL ↔ SSDL 轉換,將 ESQL/LINQ 轉為目標資料庫 SQL,實現邏輯與物理分離。
  3. Object Services (物件服務):核心服務層,提供 ObjectContext、變更追蹤、身分對應、併發控制、延遲載入、查詢物件化 (Materialization) 等高階功能。
  4. LINQ to Entities:整合 LINQ 查詢運算子,提供強型別、編譯時期驗證的查詢體驗,依賴 Object Services 與 Mapping Layer。

三、 與傳統 ADO.NET 對應關係

ADO.NETEntity Framework說明
SqlConnectionEntityConnection封裝中繼資料與資料庫連線字串
SqlCommandEntityCommand執行 ESQL 或預存程序
SqlDataReaderEntityDataReader唯讀、順向資料流,適用大量資料串流
DataSetObjectQuery<T> / ObjectContext物件圖、變更追蹤、關聯導覽、持久化
DataTableEntity (實體類)強型別物件,含導覽屬性
—CSDL/SSDL/MSL中繼資料定義,EDMX 封裝

注意:此對應僅為概念類比,兩者底層機制迥異。

四、 EntityConnection:連線字串三段式

EntityConnection 連線字串包含三部分,以分號分隔:

metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;
provider=System.Data.SqlClient;
provider connection string="Data Source=.;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=True;"
  • metadata:指定 CSDL/SSDL/MSL 資源位置 (內嵌組件、檔案、資源流)
  • provider:ADO.NET 提供者名稱
  • provider connection string:傳遞給底層 Provider 的原生連線字串

五、 EntityCommand 與 EntityDataReader:輕量級資料存取

適合唯讀、高效能、大量資料串流場景,不需要物件追蹤與關聯導覽。

var conn = new EntityConnection(connString);
var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT VALUE p FROM MyContext.Products AS p WHERE p.CategoryID = @cat";
cmd.Parameters.AddWithValue("cat", 1);

conn.Open();
using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
    while (reader.Read())
    {
        Console.WriteLine("{0}, {1}", reader["ProductName"], reader["UnitPrice"]);
    }
}
  • SELECT VALUE 回傳實體實例;SELECT p.Name, p.Price 回傳匿名記錄 (DbDataRecord)。
  • 支援 CommandBehavior.SequentialAccess 處理大型二進位欄位。

六、 ObjectContext 與 ObjectQuery:物件導向完整體驗

這是 EF 開發的主流模式,提供完整的變更追蹤、關聯導覽、LINQ/ESQL 查詢、持久化。

6.1 基本查詢

var conn = new EntityConnection(connString);
var context = new ObjectContext(conn);
context.DefaultContainerName = "MyContext";

var query = context.CreateQuery("Products"); // 實體集名稱
foreach (var p in query) Console.WriteLine(p.ProductName);

6.2 ESQL 參數化查詢

var query = context.CreateQuery(
    "SELECT VALUE p FROM MyContext.Products AS p WHERE p.ProductID = @id",
    new ObjectParameter("id", 1));

6.3 LINQ to Entities (推薦)

var query = context.CreateQuery("Products")
    .Where(p => p.CategoryID == 1)
    .OrderBy(p => p.ProductName);

七、 兩種模式選擇指南

場景推薦模式理由
報表、匯出、大量唯讀資料EntityDataReader低記憶體佔用、高吞吐量、無物件化開銷
商業邏輯、CRUD、關聯導覽、變更追蹤ObjectContext/ObjectQuery完整 ORM 功能、強型別、開發效率高
動態查詢條件組裝ESQL (EntityCommand 或 ObjectQuery)字串靈活拼接、不需編譯期型別
強型別、重構安全、IntelliSenseLINQ to Entities編譯期檢查、程式碼可讀性最佳

結語

Entity Framework 透過 EDM 將資料庫結構抽象為豐富的概念模型,提供從輕量級的 EntityDataReader 到完整功能的 ObjectContext 多層次存取介面。理解架構分層、連線字串結構、兩種查詢模式的優缺點,能幫助您在專案初期做出正確的技術選型,並在開發過程中遊刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved