“幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】
劉德華 有一首歌叫《馬桶》,其中有一句歌詞是:每一個(gè)馬桶都是英雄。
EFCore也有一個(gè)英雄,在幕后默默地任勞任怨。它就叫 "支持字段" (Backing Fields):
中文版:https://docs.microsoft.com/zh-cn/ef/core/modeling/backing-field
支持字段允許 EF 讀取和/或?qū)懭胱侄味皇且粋€(gè)屬性。 在類中的封裝用于限制的使用和/或增強(qiáng)圍繞訪問數(shù)據(jù)的語義由應(yīng)用程序代碼,但值應(yīng)進(jìn)行讀取和/或?qū)懭氲綌?shù)據(jù)庫而無需使用這些限制時(shí)這很有用 /增強(qiáng)功能。英文版:https://docs.microsoft.com/en-us/ef/core/modeling/backing-field
Backing fields allow EF to read and/or write to a field rather than a property. This can be useful when encapsulation in the class is being used to restrict the use of and/or enhance the semantics around access to the data by application code, but the value should be read from and/or written to the database without using those restrictions/enhancements.
它可以用于什么場景呢?簡單地說,當(dāng)我們沒有特別地指定類的屬性與數(shù)據(jù)表字段名的話,在裝載 數(shù)據(jù)表的內(nèi)容 到 類 的時(shí)候,EFCore會(huì)直接地找到屬性名對應(yīng)的數(shù)據(jù)表字段名,然后把字段的內(nèi)容賦值到類屬性中(留意,我說的是 類 的 屬性?Property,而不是 字段?Field)。但是萬一我們不想EFCore這樣做呢?例如,以下的倆場景:
- 場景一
我們有一個(gè)User類,它有一個(gè)叫Password的屬性,由于是單向加密,所以希望:每次對它賦值的時(shí)候,它都自動(dòng)做MD5加密;然后對它讀取的時(shí)候,它都只返回MD5加密后的內(nèi)容(而不是加密前的內(nèi)容)
- 場景二
某些金融應(yīng)用,由于需要支持不同貨幣品種的小數(shù)點(diǎn)后位數(shù)精度的要求,金額在數(shù)據(jù)庫儲存的時(shí)候,或者和內(nèi)部其他系統(tǒng)做數(shù)據(jù)交換的時(shí)候(通常極有可能是近似于整表導(dǎo)出了),都是整型。然后只有在人機(jī)對話的界面,才把進(jìn)行小數(shù)點(diǎn)運(yùn)算后的結(jié)果顯示出來。至于貨幣品種,除了世界各國的貨幣,還可能會(huì)有虛擬貨幣(你懂得),所以小數(shù)點(diǎn)后位數(shù)的需求都不一樣的啊。
(本篇的例子的程序,可以從?https://github.com/kentliu2007/EFCoreDemo/tree/master/BackingField?下載,建議可以下載后對照著代碼來閱讀本篇。我用的是 VS2017)
按照上述場景的需求,我們有:
數(shù)據(jù)表:
Clients 的索引
ClientAccountBalance 的索引
Currencies 的索引
Users
Clients, ClientAccountBalance, Currencies
測試數(shù)據(jù):
EF6的實(shí)現(xiàn)方式
讓我們先來看看如果用EF6怎么做?EF6的話,有設(shè)計(jì)器啊,輕松容易,毫無壓力:項(xiàng)目:
EF Model Diagram:
ClientAccountBalance的設(shè)置:
rawAmount的設(shè)置,setter和getter都是internal的,因?yàn)檫@個(gè)是非 對外(public)屬性User的設(shè)置:
rawPassword的設(shè)置,setter和getter都是internal的,因?yàn)檫@個(gè)是非 對外(public)屬性針對場景一的,在Custom目錄下,User類的代碼:
針對場景二的,在Custom目錄下,ClientAccountBalance類的代碼:
大功告成,簡單吧?
EFCore的實(shí)現(xiàn)方式
EFCore沒有設(shè)計(jì)器,難道就“臣妾做不到”了嗎?其實(shí),借助Backing Fields的話,用EFCore來實(shí)現(xiàn),更簡單,更優(yōu)雅。告訴EFCore,指定 類 的 某個(gè)Property,所對照的 類 的 Field 是哪個(gè),且還可以指定它所對照的數(shù)據(jù)表的字段名:
告訴EFCore,類 的 某個(gè)Field ,它所對照的數(shù)據(jù)表的字段名:
Backing Fields兩個(gè)主要用法:
modelBuilder.Entity<MyEntity>().Property(b => b.MyProperty).HasField("_myField").HasColumnName("ColumnName");modelBuilder.Entity<MyEntity>().Property("_myField").HasColumnName("ColumnName");
在 DbContext.OnModelCreating方法里面,項(xiàng)目:
DbContext的程序(Backing Fields出沒,請注意):
針對場景一的,User的程序:
針對場景二的,ClientAccountBalance的程序:
搞定了。單刀直入,簡單利索。對吧?
真的就可以嗎?好吧,如果不信的話,可以下載代碼,跑一下 單元測試 來體驗(yàn)一下嘛 :-P 。
在幕后英雄Backing Fields的幫助下,我們輕輕松松地用幾行代碼就搞定了上述兩個(gè)情景的栗子了(重點(diǎn)在 DbContext 程序里面啊)。很棒,對吧?
下一篇,我將會(huì)分享一下,怎樣在 EFCore上,借助它的?Lazy Loading?來實(shí)現(xiàn),在 EF5/6 上面輕松地用 Table Mapping就實(shí)現(xiàn)了的?Entity Split?功能。
明年(今天是年二九嘛)見 :-D
相關(guān)文章:
Shadow Properties之美(一)【Microsoft Entity Framework Core隨筆】
Shadow Properties之美(二)【Microsoft Entity Framework Core隨筆】
原文地址:https://www.cnblogs.com/fatkent/p/10348864.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的“幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【NET CORE微服务一条龙应用】第二
- 下一篇: NetCore下模拟和使用Modbus工