EFCore Lazy Loading + Inheritance = 干净的数据表 (一)
前言
α角 與 β角
關(guān)于α角 與 β角的介紹,請見上文?如何用EFCore Lazy Loading實現(xiàn)Entity Split。
本篇會繼續(xù)有關(guān)于β角的彩蛋在等著大家去發(fā)掘。/斜眼笑
其他
本篇的程序,可以在?https://github.com/kentliu2007/EFCoreDemo/tree/master/InheritanceWithEntitySplit?下載。建議大家可以下載之后對照著程序來閱讀本篇(我用的是VS2017)。
由于篇幅比較長,為了方便閱讀,本篇分成兩個部分。如果耐著性子看完第一部分,而不是處女座/不是DB First er的,可以止步,不需要繼續(xù)看第二部分了。
需求
我們先來看看需求:
某校園的一個人員資料系統(tǒng),其中可登錄用戶有兩種:教師和學(xué)生。每個可登錄用戶具有以下屬性:
用戶登錄名 (該系統(tǒng)用戶的唯一標(biāo)識值)
姓
名
密碼
教師。系統(tǒng)需要記錄?教師?的以下屬性:
教職工號碼 (某校園里,該教師的唯一標(biāo)示值)
工資級別 (自編的工資級別)
學(xué)生。系統(tǒng)需要記錄?學(xué)生?的以下屬性:
學(xué)生編號 (某校園里,該學(xué)生的唯一標(biāo)示值)
學(xué)生就讀年級
邏輯設(shè)計
根據(jù)上述需求,我們會有以下這樣的類的設(shè)計:
上述設(shè)計還有一個一點點不同的版本:
物理設(shè)計
從邏輯設(shè)計到物理設(shè)計,會由于我們選擇的具體的實現(xiàn)方式而產(chǎn)生一定的偏差。例如,不同廠商的數(shù)據(jù)庫引擎,或者不選用數(shù)據(jù)庫引擎而選用其他的產(chǎn)品(MQ或者NoSQL類產(chǎn)品),甚至不同的ORM產(chǎn)品,都會引致偏差的發(fā)生。
用EF6怎么實現(xiàn)
下面我們從DB First er的角度,直接根據(jù)上述的邏輯設(shè)計,設(shè)計出數(shù)據(jù)表。然后再看看用EF6如何實現(xiàn)。
數(shù)據(jù)表
Users的索引
Students的索引
Teachers的索引
FK_Students_Users的設(shè)置
FK_Teachers_Users的設(shè)置
EF Model
在各種wizard的幫助下,逆向工程后,我們需要做一些小改動,刪掉某些Property,以及Navigation Property,然后把 Inheritance 關(guān)系拉好。并且轉(zhuǎn)換一下 User.UserType為Enum UserTypes。
于是我們就有了這樣的 EF Model:
(第一個β角的彩蛋,我們根據(jù)習(xí)慣,通常會把UserType設(shè)置為Enum。這個和邏輯設(shè)計有一點點偏差)
程序
Solution
Unit Test
測試數(shù)據(jù)
EF6對類的繼承提供了支持,所以從類到表,然后再到EF,一切都很順其自然,一氣呵成。
用EFCore怎么實現(xiàn)
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,所以我們按照文檔來走一遍,然后對本篇的需求,就會有以下的產(chǎn)出:
程序
Solution
User、Student和Teacher的程序
DBContext的程序
Unit Test程序
數(shù)據(jù)表
有了上述的程序,我們跑一下Migration命令,于是就有以下的表結(jié)構(gòu)
Migration命令
表結(jié)構(gòu)
Users的索引
沒有其他表了?真的沒有了。用EF Core的正向工程,上述的三個父子類,它就是生成這樣一個數(shù)據(jù)表,就夠了。當(dāng)然DBA還可能對數(shù)據(jù)表做一點改動,例如 主鍵不要是 聚集索引等。不過基于不騙篇幅的借口,讓我們偷一下懶吧。 :-P
(第二個β角的彩蛋出現(xiàn)了。由于我們選用了 EF Core,物理設(shè)計的數(shù)據(jù)表,竟然和邏輯設(shè)計有著喇么大的偏差)
測試數(shù)據(jù)
好吧,看起來用EFCore來實現(xiàn)類的繼承也很簡單。一切操作只需要按照教程一步步搗弄,也很直接方便。
本篇結(jié)語
上面就是EF6 和 EFCore分別怎樣支持 類的繼承的做法。如果你是Code First er,可以止步于此了。
如果你是處女座,或者 DB First er,
你會發(fā)現(xiàn)EFCore正向工程后的數(shù)據(jù)表,表結(jié)構(gòu)很特別,且看著測試數(shù)據(jù)的結(jié)果,會感覺是一堵裝飾墻。反正就是總覺得有說不出來的違和感。
你會想,有沒有可能,讓EFCore,用上和邏輯設(shè)計之間β角偏差最小的數(shù)據(jù)表呢?
如果你有上述的感覺和疑問,歡迎繼續(xù)看下一篇EFCore Lazy Loading + Inheritance = 干凈的數(shù)據(jù)表 (二) 【獻(xiàn)給處女座的DB First程序猿】。
相關(guān)文章:
Shadow Properties之美(一)【Microsoft Entity Framework Core隨筆】
Shadow Properties之美(二)【Microsoft Entity Framework Core隨筆】
“幕后英雄”之Backing Fields【Microsoft Entity Framework Core隨筆】
如何用EFCore Lazy Loading實現(xiàn)Entity Split
原文地址:https://www.cnblogs.com/fatkent/p/10396596.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的EFCore Lazy Loading + Inheritance = 干净的数据表 (一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部署Chart应用并使用.net cor
- 下一篇: 程序员过关斩将--快速迁移10亿级数据