Shadow Properties之美(一)【Microsoft Entity Framework Core随笔】
最近在做公司的項(xiàng)目的時(shí)候,開始把部分程序遷移到EF Core,然后有了一些感觸,趁著還沒忘卻,還是先記錄下來。
EF Core還在成長中,我寫這個(gè)的時(shí)候,版本是2.2。如果對(duì)著已有的EF 5/6來說,還有很多功能要迎頭趕上的,所以這個(gè)也是為什么在.net core 3的標(biāo)準(zhǔn)中,計(jì)劃要支持EF 6(這個(gè)其實(shí)是一次性買賣),就是想讓大家可以先把.net Core (EF6)用起來,讓EF Core先緩口氣,等它成長足夠了,再遷移到.net Core (EF Core)這樣的組合。
即便如此,現(xiàn)在版本的EF Core已經(jīng)有好多不少的閃亮之處(當(dāng)然也有一些會(huì)因?yàn)樽约簺]學(xué)好而誤會(huì)了它的坑)。不論是閃亮點(diǎn),還是坑,我有時(shí)間的話,會(huì)緩緩道來。
Shadow Properties這個(gè)特性很好,值得先拿出來說一下。但是博客本來就不適宜寫得長,不然就不適合碎片閱讀。所以我會(huì)把它分開來寫。而且我還可能會(huì)比較啰嗦,有騙字?jǐn)?shù)的嫌疑。
Shadow properties are properties that are not defined in your .NET entity class but are defined for that entity type in the EF Core model. The value and state of these properties is maintained purely in the Change Tracker. (https://docs.microsoft.com/en-us/ef/core/modeling/shadow-properties)
簡(jiǎn)單地說,隱藏屬性 (Shadow Properties),就是那些邏輯設(shè)計(jì)里面沒有的,但是物理設(shè)計(jì)里面卻要有的屬性。邏輯設(shè)計(jì) vs. 物理設(shè)計(jì),是做面向?qū)ο缶幊痰墓コ仟{,都需要面對(duì)的問題。例如,那些數(shù)據(jù)庫自增長的ID,審計(jì)類字段,還有例如做數(shù)據(jù)庫訂閱所需要的時(shí)間戳等等。很繞口,讓我說人話,就是我們的business class(業(yè)務(wù)類),是不會(huì)包括那些只對(duì)照某數(shù)據(jù)庫,或者中間件才冒出來的神馬ID之類的屬性,而我們卻可以在EF Core層面,搞定這些ID的安置方式,而不需要另外再弄一個(gè)新的EF class。
有了這個(gè),我們就可以保持邏輯設(shè)計(jì)的干凈,也可以省了再去多弄一個(gè)EF Class。或者干脆就著EF Class來細(xì)細(xì)搗弄(為了繼續(xù)保持邏輯層的干凈)。后述的兩種手法,在我們靈活運(yùn)用EF 5/6的時(shí)候,已經(jīng)屢見不鮮了。
簡(jiǎn)單舉個(gè)幾個(gè)栗子(邊幅所限,本篇先來一個(gè)個(gè)簡(jiǎn)單的,后面的繼續(xù)舉拖沓的栗子,繼續(xù)騙字?jǐn)?shù))。例如,我們會(huì)在數(shù)據(jù)庫有一些 LastUpdateBy (記錄最后修改者/兼顧新增此記錄建立者)、LastUpdateDate(記錄最后改動(dòng)的日期和時(shí)間)、CreatedDate(新增此記錄的日期和時(shí)間)等等,提供簡(jiǎn)單審計(jì)記錄功能的字段。但是,我們的Class里面,真心不想要這些屬性。這個(gè)時(shí)候,我們可以繼續(xù)保持原有business class不變。而在我們的DBContext class的OnModuleCreating方法中,針對(duì)某個(gè)需要有上述審計(jì)字段的Entity,加上這些Shadow Properties。下面的代碼片段的例子,只支持UpdateDate和UpdateBy,CreateDate請(qǐng)自行腦補(bǔ)哈(Tips: EntityState.Added 狀態(tài)下才更新此屬性的值)。
?很簡(jiǎn)單對(duì)吧?只需要偷偷地在自己的DBContext里面搗弄一下,根本不需要讓上層建筑知道那么多,我們就支持了僅在數(shù)據(jù)表里面才有的審計(jì)類字段。
接下來,下一篇,會(huì)舉一個(gè)更啰嗦的栗子。解釋一下,為什么我們的business class,不應(yīng)該有那些由于物理設(shè)計(jì)(落地選型)所帶出來的各式各樣的神馬ID,以及怎么用Shadow Properties來支持。但是因?yàn)檫@個(gè)涉及到asp.net core web api的相應(yīng)改動(dòng),所以值得另開一個(gè)帖子來騙字?jǐn)?shù)了。
原文地址:
https://www.cnblogs.com/fatkent/p/EFCore_ShadowProperties_1.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號(hào)文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的Shadow Properties之美(一)【Microsoft Entity Framework Core随笔】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序开发必看,《使用 .NET C
- 下一篇: 程序员修仙之路--高性能排序多个文件