
- 實體框架教程
- 實體框架 - 首頁
- 實體框架 - 概述
- 實體框架 - 架構
- 實體框架 - 環境設定
- 實體框架 - 資料庫設定
- 實體框架 - 資料模型
- 實體框架 - DbContext
- 實體框架 - 型別
- 實體框架 - 關係
- 實體框架 - 生命週期
- 實體框架 - 程式碼優先方法
- 實體框架 - 模型優先方法
- 實體框架 - 資料庫優先方法
- 實體框架 - 開發方法
- 實體框架 - 資料庫操作
- 實體框架 - 併發
- 實體框架 - 事務
- 實體框架 - 檢視
- 實體框架 - 索引
- 實體框架 - 儲存過程
- 實體框架 - 斷開連線的實體
- 實體框架 - 表值函式
- 實體框架 - 原生 SQL
- 實體框架 - 列舉支援
- 實體框架 - 非同步查詢
- 實體框架 - 持久化
- 實體框架 - 投影查詢
- 實體框架 - 命令日誌
- 實體框架 - 命令攔截
- 實體框架 - 空間資料型別
- 實體框架 - 繼承
- 實體框架 - 遷移
- 實體框架 - 渴望載入
- 實體框架 - 延遲載入
- 實體框架 - 顯式載入
- 實體框架 - 驗證
- 實體框架 - 跟蹤更改
- 實體框架 - 彩色實體
- 實體框架 - 程式碼優先方法
- 實體框架 - 第一個示例
- 實體框架 - 資料註釋
- 實體框架 - Fluent API
- 實體框架 - 種子資料庫
- 實體框架 - 程式碼優先遷移
- 實體框架 - 多個 DbContext
- 實體框架 - 巢狀實體型別
- 實體框架資源
- 實體框架 - 快速指南
- 實體框架 - 有用資源
- 實體框架 - 討論
實體框架 - 繼承
繼承使建立更復雜、更能反映開發者思維方式的模型成為可能,同時減少了與這些模型互動所需的工作量。與實體一起使用的繼承與與類一起使用的繼承具有相同的用途,因此開發者已經瞭解此功能的工作原理。
讓我們看一下以下示例,並透過建立一個新的控制檯應用程式專案。
步驟 1 - 透過右鍵單擊專案名稱並選擇新增 → 新建項…新增 ADO.NET 實體資料模型。
步驟 2 - 新增一個實體並將其命名為 Person,按照模型優先方法一章中提到的所有步驟進行操作。
步驟 3 - 新增一些標量屬性,如下面的影像所示。

步驟 4 - 我們將新增另外兩個實體學生和教師,它們將繼承 Person 表的屬性。
步驟 5 - 現在新增 Student 實體,並從“基型別”組合框中選擇 Person,如下面的影像所示。

步驟 6 - 同樣新增 Teacher 實體。
步驟 7 - 現在將 EnrollmentDate 標量屬性新增到 Student 實體,並將 HireDate 屬性新增到 Teacher 實體。

步驟 8 - 讓我們繼續生成資料庫。
步驟 9 - 右鍵單擊設計圖面,然後選擇“從模型生成資料庫…”。

步驟 10 - 要建立新的資料庫,請單擊“新建連線…”。將開啟以下對話方塊。單擊“確定”。

步驟 11 - 單擊“完成”。這將在專案中新增一個 *.edmx.sql 檔案。您可以透過開啟 .sql 檔案在 Visual Studio 中執行 DDL 指令碼。現在右鍵單擊並選擇“執行”。
步驟 12 - 轉到伺服器資源管理器,您將看到已建立了三個指定表名資料庫。

步驟 13 - 您還可以看到以下域類也自動生成了。
public partial class Person { public int ID { get; set; } public string FirstMidName { get; set; } public string LastName { get; set; } } public partial class Student : Person { public System.DateTime EnrollmentDate { get; set; } } public partial class Teacher : Person { public System.DateTime HireDate { get; set; } }
以下是 Context 類。
public partial class InheritanceModelContainer : DbContext { public InheritanceModelContainer() : base("name = InheritanceModelContainer") {} protected override void OnModelCreating(DbModelBuilder modelBuilder) { throw new UnintentionalCodeFirstException(); } public virtual DbSet<Person> People { get; set; } }
讓我們向資料庫中新增一些學生和教師,然後從資料庫中檢索它們。
class Program { static void Main(string[] args) { using (var context = new InheritanceModelContainer()) { var student = new Student { FirstMidName = "Meredith", LastName = "Alonso", EnrollmentDate = DateTime.Parse(DateTime.Today.ToString()) }; context.People.Add(student); var student1 = new Student { FirstMidName = "Arturo", LastName = "Anand", EnrollmentDate = DateTime.Parse(DateTime.Today.ToString()) }; context.People.Add(student1); var techaer = new Teacher { FirstMidName = "Peggy", LastName = "Justice", HireDate = DateTime.Parse(DateTime.Today.ToString()) }; context.People.Add(techaer); var techaer1 = new Teacher { FirstMidName = "Yan", LastName = "Li", HireDate = DateTime.Parse(DateTime.Today.ToString()) }; context.People.Add(techaer1); context.SaveChanges(); } } }
學生和教師已新增到資料庫中。要檢索學生和教師,需要使用OfType方法,該方法將返回與指定部門相關的學生和教師。
Console.WriteLine("All students in database"); Console.WriteLine(""); foreach (var student in context.People.OfType<Student>()) { string name = student.FirstMidName + " " + student.LastName; Console.WriteLine("ID: {0}, Name: {1}, \tEnrollment Date {2} ", student.ID, name, student.EnrollmentDate.ToString()); } Console.WriteLine(""); Console.WriteLine("************************************************************ *****"); Console.WriteLine(""); Console.WriteLine("All teachers in database"); Console.WriteLine(""); foreach (var teacher in context.People.OfType<Teacher>()) { string name = teacher.FirstMidName + " " + teacher.LastName; Console.WriteLine("ID: {0}, Name: {1}, \tHireDate {2} ", teacher.ID, name, teacher.HireDate.ToString()); } Console.WriteLine(""); Console.WriteLine("************************************************************ *****"); Console.ReadKey();
在第一個查詢中,當您使用 OfType<Student>() 時,您將無法訪問 HireDate,因為 HireDate 屬性是 Teacher 實體的一部分,並且類似地,當您使用 OfType<Teacher>() 時,EnrollmentDate 屬性將不可訪問。
執行上述程式碼時,您將收到以下輸出 -
All students in database ID: 1, Name: Meredith Alonso, Enrollment Date 10/30/2015 12:00:00 AM ID: 2, Name: Arturo Anand, Enrollment Date 10/30/2015 12:00:00 AM ***************************************************************** All teachers in database ID: 3, Name: Peggy Justice, HireDate 10/30/2015 12:00:00 AM ID: 4, Name: Yan Li, HireDate 10/30/2015 12:00:00 AM *****************************************************************
我們建議您逐步執行以上示例,以便更好地理解。