Table-Per-Type(TPT) MSDN 解釋說明:一類一表 (Table-Per-Type) 繼承會在資料庫中使用個別資料表來維護繼承階層架構 (Inheritance Hierarchy) 中每一個類型的非繼承屬性和索引鍵屬性。
Table 說明:
- Course 為 OnlineCourse、OnsiteCourse 的共同資料欄位
- OnlineCourse、OnsiteCourse 有各自專屬資料欄位
先建立 ADO.NET 實體模型並把 Course、OnlineCourse、OnsiteCourse 拉進去後,把 OnlineCourse、OnsiteCourse 的 [基底類型] 修改為 Course
修改完後關聯圖示會變成下圖
把 [1 對 0、1] 關聯刪除
刪除關聯後圖示
刪除 OnlineCourse、OnsiteCourse 的 CourseID Property 刪除
刪除 CourseID Property 後的 OnlineCourse、OnsiteCourse 圖示
完成圖
C# 測試
namespace EFTPT
{
class Program
{
static void Main(string[] args)
{
using (var context = new SchoolEntities())
{
// 直接對 Course 新增 OnlineCourse、OnSiteCourse
context.Course.Add(new OnlineCourse() { CourseID = 9998, Title = "Online 課程", Credits = 4, DepartmentID = 7, URL = "https://www.google.com/" });
context.Course.Add(new OnsiteCourse() { CourseID = 9999, Title = "OnSite 課程", Credits = 4, DepartmentID = 7, Location = "KH", Days = "MWHF", Time = DateTime.Today });
context.SaveChanges();
// 抓出新增兩筆資料-9998、9999
Console.WriteLine("============ 新增資料 ============");
var InsertResult = context.Course.Where(c => c.CourseID == 9998 || c.CourseID == 9999);
foreach (var c in InsertResult)
{
Console.WriteLine($"CourseID:{c.CourseID}-Title:{c.Title}");
}
// 顯示新增 OnlineCourse 資料
Console.WriteLine("============ 新增 OnlineCourse 資料 ============");
foreach (var ol in InsertResult.OfType<OnlineCourse>())
{
Console.WriteLine($"CourseID:{ol.CourseID}-Title:{ol.Title}-URL:{ol.URL}");
}
// 顯示新增 OnSiteCourse 資料
Console.WriteLine("============ 新增 OnsiteCourse 資料 ============");
foreach (var os in InsertResult.OfType<OnsiteCourse>())
{
Console.WriteLine($"CourseID:{os.CourseID}-Title:{os.Title}-Location:{os.Location}-Day:{os.Days}");
}
}
}
}
}
測試結果從 DB 觀察結果
沒有留言:
張貼留言