歡迎光臨
每天分享高質量文章

EFCore Lazy Loading + Inheritance = 乾凈的資料表 (一)

前言

α角 與 β角

關於α角 與 β角的介紹,請見上文 如何用EFCore Lazy Loading實現Entity Split
本篇會繼續有關於β角的彩蛋在等著大家去發掘。/斜眼笑

其他

  • 本篇的程式,可以在 https://github.com/kentliu2007/EFCoreDemo/tree/master/InheritanceWithEntitySplit 下載。建議大家可以下載之後對照著程式來閱讀本篇(我用的是VS2017)。
  • 由於篇幅比較長,為了方便閱讀,本篇分成兩個部分。如果耐著性子看完第一部分,而不是處女座/不是DB First er的,可以止步,不需要繼續看第二部分了。

需求

我們先來看看需求:

  • 某校園的一個人員資料系統,其中可登入使用者有兩種:教師和學生。每個可登入使用者具有以下屬性:
    • 使用者登入名 (該系統使用者的唯一標識值)
    • 密碼
  • 教師。系統需要記錄 教師 的以下屬性:
    • 教職工號碼 (某校園裡,該教師的唯一標示值)
    • 工資級別 (自編的工資級別)
  • 學生。系統需要記錄 學生 的以下屬性:
    • 學生編號 (某校園裡,該學生的唯一標示值)
    • 學生就讀年級

邏輯設計

根據上述需求,我們會有以下這樣的類的設計:

上述設計還有一個一點點不同的版本:

物理設計

從邏輯設計到物理設計,會由於我們選擇的具體的實現方式而產生一定的偏差。例如,不同廠商的資料庫引擎,或者不選用資料庫引擎而選用其他的產品(MQ或者NoSQL類產品),甚至不同的ORM產品,都會引致偏差的發生。

用EF6怎麼實現

下麵我們從DB First er的角度,直接根據上述的邏輯設計,設計出資料表。然後再看看用EF6如何實現。

資料表

  • Users的索引

  • Students的索引

  • Teachers的索引

  • FK_Students_Users的設定
  • FK_Teachers_Users的設定
EF Model

在各種wizard的幫助下,逆向工程後,我們需要做一些小改動,刪掉某些Property,以及Navigation Property,然後把 Inheritance 關係拉好。並且轉換一下 User.UserType為Enum UserTypes。
於是我們就有了這樣的 EF Model:



(第一個β角的彩蛋,我們根據習慣,通常會把UserType設定為Enum。這個和邏輯設計有一點點偏差)

程式
  • Solution
  • Unit Test
  • 測試資料

EF6對類的繼承提供了支援,所以從類到表,然後再到EF,一切都很順其自然,一氣呵成。

用EFCore怎麼實現

EFCore也提供類的繼承的支援,可以在這裡檢視微軟的檔案:https://docs.microsoft.com/zh-cn/ef/core/modeling/inheritance ,以及 https://docs.microsoft.com/zh-cn/ef/core/modeling/relational/inheritance
由於EFCore更加傾向於Code First,所以我們按照檔案來走一遍,然後對本篇的需求,就會有以下的產出:

程式
  • Solution
  • User、Student和Teacher的程式
    public partial class User
    {        public string LoginName { get; set; }        public string FirstName { get; set; }        public string LastName { get; set; }        public string Password { get; set; }
    }    public partial class Student : User
    {        public string StudentCode { get; set; }        public int GradeLevel { get; set; }
    }    public partial class Teacher : User
    {        public string StaffCode { get; set; }        public int SalaryGrade { get; set; }
    }
  • DBContext的程式
  • Unit Test程式
資料表

有了上述的程式,我們跑一下Migration命令,於是就有以下的表結構

  • Migration命令
  • 表結構
  • Users的索引

沒有其他表了?真的沒有了。用EF Core的正向工程,上述的三個父子類,它就是生成這樣一個資料表,就夠了。當然DBA還可能對資料表做一點改動,例如 主鍵不要是 聚集索引等。不過基於不騙篇幅的藉口,讓我們偷一下懶吧。 😛
(第二個β角的彩蛋出現了。由於我們選用了 EF Core,物理設計的資料表,竟然和邏輯設計有著喇麼大的偏差)

  • 測試資料

好吧,看起來用EFCore來實現類的繼承也很簡單。一切操作只需要按照教程一步步搗弄,也很直接方便。

本篇結語

上面就是EF6 和 EFCore分別怎樣支援 類的繼承的做法。如果你是Code First er,可以止步於此了。
如果你是處女座,或者 DB First er,

  • 你會發現EFCore正向工程後的資料表,表結構很特別,且看著測試資料的結果,會感覺是一堵裝飾牆。反正就是總覺得有說不出來的違和感。
  • 你會想,有沒有可能,讓EFCore,用上和邏輯設計之間β角偏差最小的資料表呢?

如果你有上述的感覺和疑問,歡迎繼續看下一篇EFCore Lazy Loading + Inheritance = 乾凈的資料表 (二) 【獻給處女座的DB First程式猿】。

相關文章:

原文地址:https://www.cnblogs.com/fatkent/p/10396596.html


.NET社群新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com


 

    閱讀原文

    贊(0)

    分享創造快樂