在上一次教程中,你已經能夠處理並發異常。這個教程將會展示如何在數據模型中實現繼承。 在面向對象的程序設計中,你可以通過繼承來清除冗余的代碼。在這個教程中,你將要通過修改教師 Instructor 和學生 Student 類,以便使他們從包含類似 LastName 屬性的 Person 類中派生。對於 Web 頁面不需要任何改動,你需要修改一點代碼,這些修改將會被自動反射到數據庫中。
8-1 單表繼承 (Table-per-Hierarchy) 對類型表 (Table-per-Type) 繼承
在面向對象的程序設計中,你可以通過對相關的類使用繼承來使得工作更加簡單。例如,教師 Instructor 和學生 Student 類在學校 School 數據模型中共享多個屬性,帶來了冗余的代碼。
假設你希望清除在教師 Instructor 和學生 Student 之間所共享的屬性帶來的冗余代碼。可以創建一個 Person 基類,其中僅僅包含他們共享的屬性,然後,使得教師 Instructor 和學生 Student 類從 Person 基類派生,如下圖所示。
在數據庫中這種繼承結構可以有多種表現形式,可以創建一個名為 Person 的表,在這個獨立的表中包含教師和學生所有的信息。既包括他們獨自擁有的屬性 ( 例如教師的 HireDate ,以及學生的 EnrollmentDate ),也包括它們共有的屬性 ( 例如 LastName, FirstName )。通常你還需要一個用於識別當前類型的列 discriminator 來標識當前行的類型。( 在這裡,標識列的內容為 Instructor 來表示教師,Student 來表示學生 )
使用單個數據庫表來生成實體繼承結構的模式稱為單表繼承模式 TPH (table-per-hierarchy )。 另外一種方式是使得數據庫看起來類似繼承結構。例如,在 Person 表中僅僅包含他們共有的名字屬性,而將不同的時間分別保存到獨立的 Instructor 和 Student 表中。
這種每種實體類對應一張數據庫表的模式稱為類型表 TPT 繼承 (table per type )。 在 EF 中,TPH 繼承比 TPT 繼承有更好的性能,因為 TPT 繼承需要復雜的連接查詢。這個教程演示如何實現 TPH 繼承。你需要完成如下的步驟:
創建 Person 類,將 Instructor 和 Student 類從 Person 類中派生
在數據庫上下文類中增加模型到數據庫的映射代碼
將項目中的 InstructorID 和 StudentID 修改為使用 PersonID.