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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/4 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 “幕后英雄”之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兩個主要用法:
      在 DbContext.OnModelCreating方法里面,

      modelBuilder.Entity<MyEntity>().Property(b => b.MyProperty).HasField("_myField").HasColumnName("ColumnName");modelBuilder.Entity<MyEntity>().Property("_myField").HasColumnName("ColumnName");
    • 項目:

    • 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随笔】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。