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