Entity Data Model (EDM) 是 Entity Framework 的靈魂,定義了概念模型 (CSDL)、儲存模型 (SSDL) 及其映射關係 (MSL)。本文將帶您從模型結構基礎出發,深入掌握設計器操作、EDMX 結構、Context 與實體類生成、映射規則、繼承策略、多表聯合,以及各類關聯 (Association) 的配置與資料操作實戰。
關鍵規則:概念模型必須有實體鍵且對應資料表主鍵;唯一鍵不映射至概念模型;預設實體鍵不可修改;支援複合主鍵與基於主鍵的關聯。
Visual Studio 設計器提供圖形化介面,支援從資料庫反向產生模型、手動建立實體/關聯、設定映射細節。模型生成選項可控制複數化、外鍵屬性顯示等。
EDMX 為 XML 格式,包含三大區段:
<edmx:Edmx>
<edmx:Runtime>
<edmx:StorageModels> <!-- SSDL: 資料庫結構 --> </edmx:StorageModels>
<edmx:ConceptualModels> <!-- CSDL: 概念模型 --> </edmx:ConceptualModels>
<edmx:Mappings> <!-- MSL: C-S 映射 --> </edmx:Mappings>
</edmx:Runtime>
<edmx:Designer> <!-- 設計器版面配置 --> </edmx:Designer>
</edmx:Edmx>
ObjectQuery<T> 屬性存取實體集,提供 AddTo[EntitySet] 方法。EntityObject,屬性標註 EdmScalarProperty、DataMember,實作 INotifyPropertyChanged,提供靜態工廠方法 Create[Entity]。| 規則 | 說明 |
|---|---|
| 類型/鍵/非空一致 | 概念模型屬性型別、鍵、非空約束必須與儲存模型對應欄位一致 |
| 名稱可不同 | 概念屬性名稱與資料庫欄位名稱可透過映射對應 |
| 儲存端約束必映射 | 資料表主鍵、非空欄位在概念模型必須有對應屬性 |
| 概念屬性必有對應 | 概念模型每個屬性必須映射至儲存模型某欄位 |
| 多對一映射 | 多個資料庫欄位可映射至同一概念屬性:讀取取第一個,寫入同步更新所有 |
透過 映射條件 實現 Table-Per-Hierarchy (TPH) 繼承:某欄位值決定實體型別。條件欄位不映射為屬性,查詢自動篩選,新增時自動填入設計時設定的常值。
ObjectQuery<Base> 集合.OfType<Derived>() 篩選特定型別資料將單一實體橫向切分對應至多個資料表 (主鍵對主鍵)。新增/刪除時同步操作多張表,查詢自動 JOIN。適合將大型資料表垂直分割為常用與不常用欄位群組。
EntityCollection<Child>、EntityReference<Parent>) 表示操作範例:
// 從主表存取明細
var parent = context.Parent.First();
parent.Children.Load(); // 明確載入
foreach (var child in parent.Children) { ... }
// 從明細存取主表
var child = context.Child.First();
child.ParentReference.Load();
var parent = child.Parent;
// 新增明細兩種方式
parent.Children.Add(new Child { ... }); // 透過集合
context.AddToChild(new Child { Parent = parent }); // 直接設定 Reference
雙向 EntityReference,主鍵共享或外鍵唯一。操作模式同一對多,但集合為單一參考。
資料庫需中介表 (僅含兩個外鍵)。EF 支援隱式中介 (概念模型直接雙向集合,無中介實體) 與顯式中介 (中介表對應實體,可攜帶額外屬性)。隱式模式下操作極簡單:student.Courses.Add(course) 即建立關聯。
EF 支援三類預存程序映射:
ObjectResult<Entity>,支援追蹤。ObjectParameter 接收回傳值或輸出參數。設計器嚮導可自動導入預存程序並建立對應方法,大幅減少手工編碼。
掌握 EDM 建模、映射規則與關聯配置,是驅馭 Entity Framework 的關鍵。從概念模型設計到儲存模型映射,從簡單一對多到複雜繼承與多對多,本文提供的完整知識脈絡與實戰代碼,將助您在專案中靈活應對各種資料建模挑戰。