- 實體框架教程
- 實體框架 - 首頁
- 實體框架 - 概述
- 實體框架 - 架構
- 實體框架 - 環境設定
- 實體框架 - 資料庫設定
- 實體框架 - 資料模型
- 實體框架 - 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 *****************************************************************
我們建議您逐步執行以上示例,以便更好地理解。