日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

“幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】

發(fā)布時(shí)間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 “幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

劉德華 有一首歌叫《馬桶》,其中有一句歌詞是:每一個(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è)主要用法:
      在 DbContext.OnModelCreating方法里面,

      modelBuilder.Entity<MyEntity>().Property(b => b.MyProperty).HasField("_myField").HasColumnName("ColumnName");modelBuilder.Entity<MyEntity>().Property("_myField").HasColumnName("ColumnName");
    • 項(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。