星期一, 4月 15, 2019

[EF] TPT

該篇為 MSDN 文章 - 設計工具的 TPT 繼承 的練習筆記

Table-Per-Type(TPT) MSDN 解釋說明:一類一表 (Table-Per-Type) 繼承會在資料庫中使用個別資料表來維護繼承階層架構 (Inheritance Hierarchy) 中每一個類型的非繼承屬性和索引鍵屬性。

Table 說明:
  • Course 為 OnlineCourse、OnsiteCourse  的共同資料欄位
  • OnlineCourse、OnsiteCourse 有各自專屬資料欄位
[EF] TPT-11

先建立 ADO.NET 實體模型並把 Course、OnlineCourse、OnsiteCourse 拉進去後,把 OnlineCourse、OnsiteCourse 的 [基底類型] 修改為 Course

[EF] TPT-1

修改完後關聯圖示會變成下圖

[EF] TPT-3

把 [1 對 0、1] 關聯刪除

[EF] TPT-4

刪除關聯後圖示

[EF] TPT-5

刪除 OnlineCourse、OnsiteCourse 的 CourseID Property 刪除

[EF] TPT-6

刪除 CourseID Property 後的 OnlineCourse、OnsiteCourse 圖示

[EF] TPT-7

完成圖

[EF] TPT-8
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}");
                }
            }
        }
    }
}
測試結果

[EF] TPT-9

從 DB 觀察結果

[EF] TPT-10

沒有留言:

張貼留言