ADO.NET Entity Framework (EF) 是微軟推出的企業級 ORM 框架,透過實體資料模型 (EDM) 將資料庫結構抽象為概念模型,讓開發人員面向物件而非資料表進行開發。本文將為您拆解 EF 核心架構、關鍵術語,並詳細對比兩種基礎資料存取方式:EntityDataReader (類 ADO.NET) 與 ObjectContext/ObjectQuery (物件導向)。
| 術語 | 全稱 | 角色 |
|---|---|---|
| LINQ to Entities | Language Integrated Query to Entities | 強型別查詢語言,編譯期檢查,IntelliSense 支援 |
| ESQL | Entity SQL | 類 SQL 字串查詢,動態組裝,獨立於儲存引擎 |
| EF | ADO.NET Entity Framework | 整體框架,包含映射、物件服務、查詢管線 |
| EDM | Entity Data Model | 實體資料模型:CSDL + SSDL + MSL |
| Entity | Entity | 概念模型中的實體型別,具備身分識別 (Key) |
| CSDL | Conceptual Schema Definition Language | 定義實體、關聯、實體容器、集合 |
| SSDL | Store Schema Definition Language | 定義資料庫結構:資料表、欄位、鍵、關聯 |
| MSL | Mapping Specification Language | 定義 CSDL 與 SSDL 之間的映射關係 |
ObjectContext、變更追蹤、身分對應、併發控制、延遲載入、查詢物件化 (Materialization) 等高階功能。| ADO.NET | Entity Framework | 說明 |
|---|---|---|
| SqlConnection | EntityConnection | 封裝中繼資料與資料庫連線字串 |
| SqlCommand | EntityCommand | 執行 ESQL 或預存程序 |
| SqlDataReader | EntityDataReader | 唯讀、順向資料流,適用大量資料串流 |
| DataSet | ObjectQuery<T> / ObjectContext | 物件圖、變更追蹤、關聯導覽、持久化 |
| DataTable | Entity (實體類) | 強型別物件,含導覽屬性 |
| — | CSDL/SSDL/MSL | 中繼資料定義,EDMX 封裝 |
注意:此對應僅為概念類比,兩者底層機制迥異。
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;"
適合唯讀、高效能、大量資料串流場景,不需要物件追蹤與關聯導覽。
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 處理大型二進位欄位。這是 EF 開發的主流模式,提供完整的變更追蹤、關聯導覽、LINQ/ESQL 查詢、持久化。
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);
var query = context.CreateQuery(
"SELECT VALUE p FROM MyContext.Products AS p WHERE p.ProductID = @id",
new ObjectParameter("id", 1));
var query = context.CreateQuery("Products")
.Where(p => p.CategoryID == 1)
.OrderBy(p => p.ProductName);
| 場景 | 推薦模式 | 理由 |
|---|---|---|
| 報表、匯出、大量唯讀資料 | EntityDataReader | 低記憶體佔用、高吞吐量、無物件化開銷 |
| 商業邏輯、CRUD、關聯導覽、變更追蹤 | ObjectContext/ObjectQuery | 完整 ORM 功能、強型別、開發效率高 |
| 動態查詢條件組裝 | ESQL (EntityCommand 或 ObjectQuery) | 字串靈活拼接、不需編譯期型別 |
| 強型別、重構安全、IntelliSense | LINQ to Entities | 編譯期檢查、程式碼可讀性最佳 |
Entity Framework 透過 EDM 將資料庫結構抽象為豐富的概念模型,提供從輕量級的 EntityDataReader 到完整功能的 ObjectContext 多層次存取介面。理解架構分層、連線字串結構、兩種查詢模式的優缺點,能幫助您在專案初期做出正確的技術選型,並在開發過程中遊刃有餘。