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

ADO.NET Entity Framework 實戰:從 EDM 建模到關聯映射完整指南

     編輯:關於.NET

前言

Entity Data Model (EDM) 是 Entity Framework 的靈魂,定義了概念模型 (CSDL)、儲存模型 (SSDL) 及其映射關係 (MSL)。本文將帶您從模型結構基礎出發,深入掌握設計器操作、EDMX 結構、Context 與實體類生成、映射規則、繼承策略、多表聯合,以及各類關聯 (Association) 的配置與資料操作實戰。

一、 模型結構核心概念

  • 概念模型 (Conceptual Model):定義實體型別、屬性、實體鍵、關聯與導覽屬性,對應 CSDL。
  • 儲存模型 (Storage Model):描述資料庫結構 (資料表、欄位、主鍵、外鍵),對應 SSDL。
  • 映射規格 (Mapping Specification):將概念模型與儲存模型連結,定義實體屬性對應資料表欄位、關聯對應外鍵關係,對應 MSL。
  • 實體容器/集合:邏輯上包含實體集合,Context 透過集合名稱存取資料。

關鍵規則:概念模型必須有實體鍵且對應資料表主鍵;唯一鍵不映射至概念模型;預設實體鍵不可修改;支援複合主鍵與基於主鍵的關聯。

二、 EDM 設計器與 EDMX 結構

2.1 設計器介面

Visual Studio 設計器提供圖形化介面,支援從資料庫反向產生模型、手動建立實體/關聯、設定映射細節。模型生成選項可控制複數化、外鍵屬性顯示等。

2.2 EDMX 檔案剖析

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>

2.3 自動生成的 Context 與實體類

  • ObjectContext 衍生類:暴露 ObjectQuery<T> 屬性存取實體集,提供 AddTo[EntitySet] 方法。
  • 實體類:繼承 EntityObject,屬性標註 EdmScalarProperty、DataMember,實作 INotifyPropertyChanged,提供靜態工廠方法 Create[Entity]。

三、 映射基本規則與條件映射

規則說明
類型/鍵/非空一致概念模型屬性型別、鍵、非空約束必須與儲存模型對應欄位一致
名稱可不同概念屬性名稱與資料庫欄位名稱可透過映射對應
儲存端約束必映射資料表主鍵、非空欄位在概念模型必須有對應屬性
概念屬性必有對應概念模型每個屬性必須映射至儲存模型某欄位
多對一映射多個資料庫欄位可映射至同一概念屬性:讀取取第一個,寫入同步更新所有

條件映射

透過 映射條件 實現 Table-Per-Hierarchy (TPH) 繼承:某欄位值決定實體型別。條件欄位不映射為屬性,查詢自動篩選,新增時自動填入設計時設定的常值。

四、 繼承策略與多表聯合

4.1 繼承實作要點

  • 基底實體與衍生實體透過互斥條件區分(如 Type=1 為衍生A,Type=2 為衍生B)
  • 衍生實體自動繼承基底屬性,可無自身屬性
  • 所有衍生實體共用同一 ObjectQuery<Base> 集合
  • 使用 .OfType<Derived>() 篩選特定型別資料

4.2 多表聯合 (Entity Splitting)

將單一實體橫向切分對應至多個資料表 (主鍵對主鍵)。新增/刪除時同步操作多張表,查詢自動 JOIN。適合將大型資料表垂直分割為常用與不常用欄位群組。

五、 關聯映射全攻略

5.1 一對多 (1-*) —— 最常見主外鍵關聯

  • 資料端:主鍵表 (1) 對外鍵表 (*)
  • 概念模型:外鍵欄位不出現,改由導覽屬性 (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

5.2 一對一 (1-1)

雙向 EntityReference,主鍵共享或外鍵唯一。操作模式同一對多,但集合為單一參考。

5.3 多對多 (*-*)

資料庫需中介表 (僅含兩個外鍵)。EF 支援隱式中介 (概念模型直接雙向集合,無中介實體) 與顯式中介 (中介表對應實體,可攜帶額外屬性)。隱式模式下操作極簡單:student.Courses.Add(course) 即建立關聯。

六、 預存程序與函數映射

EF 支援三類預存程序映射:

  1. 回傳實體集合:映射為 Function Import,回傳 ObjectResult<Entity>,支援追蹤。
  2. 命令型 (無回傳/標量):對應 Insert/Update/Delete 函數,或自訂方法。
  3. 參數回傳值/Output 參數:透過 ObjectParameter 接收回傳值或輸出參數。

設計器嚮導可自動導入預存程序並建立對應方法,大幅減少手工編碼。

結語

掌握 EDM 建模、映射規則與關聯配置,是驅馭 Entity Framework 的關鍵。從概念模型設計到儲存模型映射,從簡單一對多到複雜繼承與多對多,本文提供的完整知識脈絡與實戰代碼,將助您在專案中靈活應對各種資料建模挑戰。

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