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的程序
DBContext的程序
Unit Test程序
數據表
有了上述的程序,我們跑一下Migration命令,于是就有以下的表結構
Migration命令
表結構
Users的索引
沒有其他表了?真的沒有了。用EF Core的正向工程,上述的三個父子類,它就是生成這樣一個數據表,就夠了。當然DBA還可能對數據表做一點改動,例如 主鍵不要是 聚集索引等。不過基于不騙篇幅的借口,讓我們偷一下懶吧。 :-P
(第二個β角的彩蛋出現了。由于我們選用了 EF Core,物理設計的數據表,竟然和邏輯設計有著喇么大的偏差)
測試數據
好吧,看起來用EFCore來實現類的繼承也很簡單。一切操作只需要按照教程一步步搗弄,也很直接方便。
本篇結語
上面就是EF6 和 EFCore分別怎樣支持 類的繼承的做法。如果你是Code First er,可以止步于此了。
如果你是處女座,或者 DB First er,
你會發現EFCore正向工程后的數據表,表結構很特別,且看著測試數據的結果,會感覺是一堵裝飾墻。反正就是總覺得有說不出來的違和感。
你會想,有沒有可能,讓EFCore,用上和邏輯設計之間β角偏差最小的數據表呢?
如果你有上述的感覺和疑問,歡迎繼續看下一篇EFCore Lazy Loading + Inheritance = 干凈的數據表 (二) 【獻給處女座的DB First程序猿】。
相關文章:
Shadow Properties之美(一)【Microsoft Entity Framework Core隨筆】
Shadow Properties之美(二)【Microsoft Entity Framework Core隨筆】
“幕后英雄”之Backing Fields【Microsoft Entity Framework Core隨筆】
如何用EFCore Lazy Loading實現Entity Split
原文地址:https://www.cnblogs.com/fatkent/p/10396596.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的EFCore Lazy Loading + Inheritance = 干净的数据表 (一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部署Chart应用并使用.net cor
- 下一篇: 程序员过关斩将--快速迁移10亿级数据