“幕后英雄”之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 的索引
      640?wx_fmt=png
      640?wx_fmt=png

    • ClientAccountBalance 的索引
      640?wx_fmt=png

    • Currencies 的索引
      640?wx_fmt=png
      640?wx_fmt=png

    • Users
      640?wx_fmt=png
      640?wx_fmt=png
      640?wx_fmt=png

    • Clients, ClientAccountBalance, Currencies
      640?wx_fmt=png

  • 测试数据:
    640?wx_fmt=png

  • EF6的实现方式
    让我们先来看看如果用EF6怎么做?EF6的话,有设计器啊,轻松容易,毫无压力:

    • 项目:
      640?wx_fmt=png

    • EF Model Diagram:
      640?wx_fmt=jpeg

    • ClientAccountBalance的设置:
      640?wx_fmt=png
      rawAmount的设置,setter和getter都是internal的,因为这个是非 对外(public)属性
      640?wx_fmt=png

    • User的设置:
      640?wx_fmt=png
      rawPassword的设置,setter和getter都是internal的,因为这个是非 对外(public)属性
      640?wx_fmt=png

    • 针对场景一的,在Custom目录下,User类的代码:
      640?wx_fmt=jpeg

    • 针对场景二的,在Custom目录下,ClientAccountBalance类的代码:
      640?wx_fmt=png

大功告成,简单吧?

  • 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");
    • 项目:
      640?wx_fmt=jpeg

    • DbContext的程序(Backing Fields出没,请注意):
      640?wx_fmt=png

    • 针对场景一的,User的程序:
      640?wx_fmt=png

    • 针对场景二的,ClientAccountBalance的程序:
      640?wx_fmt=png

搞定了。单刀直入,简单利索。对吧?
真的就可以吗?好吧,如果不信的话,可以下载代码,跑一下 单元测试 来体验一下嘛 :-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
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治、暴力)

解析 之前用KDtree做的一道题 由于懒不想再码一遍了 考虑CDQ分治 关键就是如何拿掉绝对值 如果只维护左下角的&#xff0c;显然就是一个经典的三维偏序问题了 但是本题不一定在左下角&#xff0c;也可能在左上、右下、右上 怎么办&#xff1f; 把坐标翻转翻转直接暴力做四遍即…

数论练习二之BSGS算法——随机数生成器,Matrix,Lunar New Year and a Recursive Sequence,Fermat‘s Last Theorem

[SDOI2013] 随机数生成器 description solution 肯定是非常想找一个通项公式来表示第nnn个数的 依据形式&#xff0c;考虑化成等比数列 xi1ka(xik)a⋅xibt⇒kba−1x_{i1}ka(x_ik)ax_ibt\Rightarrow k\frac{b}{a-1}xi1​ka(xi​k)a⋅xi​bt⇒ka−1b​ ⇒xiba−1ai−1(x1ba−…

L - Clock Master Gym - 102798L

L - Clock Master Gym - 102798L 题意&#xff1a; 给定一个数字n&#xff0c;令na1a2a3…求lcm(a1,a2,a3,…)的最大值,以loge(x)的形式输出 题解&#xff1a; lcm要求尽可能大&#xff0c;我们就要保证a1,a2,a3…尽可能为质数或质数的整数次幂&#xff0c;我们假设a1是p1x…

P7739-[NOI2021]密码箱【Splay,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P7739 题目描述 懒得概括&#xff0c;摸了。 Yelekastee 是 U 国著名的考古学家。在最近的一次考古行动中&#xff0c;他发掘出了一个远古时期的密码箱。经过周密而严谨的考证&#xff0c;Yelekastee 得知密码箱的密码和某一…

NetCore下模拟和使用Modbus工业通信协议

Tips&#xff1a;1、目前NetCore下与Modbus通信的框架主要选择了 Modbus.Net https://github.com/parallelbgls/Modbus.Net2、modbus是常用的工业通信协议&#xff0c;在软件调试时可以通过modbus pollslave模拟通信通过达到调试目的&#xff0c;下图是我使用软件1&#xff09…

codeforces:65

文章目录前言CF65A Harry Potter and Three SpellsDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF65B Harry Potter and the History of MagicDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\…

C - Rencontre Gym - 102798C

C - Rencontre Gym - 102798C 参考题解&#xff1a; 参考一 参考二 题意&#xff1a; 有一棵树&#xff0c;树上的点分为三种&#xff0c;&#xff08;一个点可以为多种&#xff09;&#xff0c;现在分别在三种点中随机选一点a&#xff0c;b&#xff0c;c&#xff0c;然后找到…

API标准化成为技术团队面临的最大挑战

调查表明&#xff0c;API 标准化成为了技术团队面临的最大挑战。SmartBear 发布了 2019 年 API 状态报告“The State of API 2019”&#xff0c;此报告旨在为 API 行业建立关于软件团队在 2019 年规划、设计、开发、测试、记录和监控 API 的方法、实践和工具的基准。此次调查有…

线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze

多类型高斯消元杂题[SDOI2010]外星千足虫descriptionsolutioncode[HNOI2013]游走descriptionsolutioncode[HNOI2011]XOR和路径descriptionsolutioncodeMaze(树上高斯消元)problemsolutioncode[SDOI2010]外星千足虫 description solution 高斯消元的模板题 虽然感觉问了个最…

P6117-[JOI 2019 Final]コイン集め【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P6117 题目大意 平面上有2n2n2n的硬币&#xff0c;要给每个硬币匹配一个x∈[1,n],y∈[1,2]x\in[1,n],y\in[1,2]x∈[1,n],y∈[1,2]的位置&#xff08;不能重复&#xff09;。 使得所有硬币和它们匹配位置的曼哈顿距离之和最小…

CF788789(div1div2)

文章目录前言CF789A Anastasia and pebblesDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF789B Masha and geometric depressionDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}Cod…

【HDU-2376】Average distance

【HDU-2376】Average distance 题意&#xff1a; 给你一个树&#xff0c;求树上任意两个点之间的距离的平均值 题解&#xff1a; 就是求出任意两点之间的距离和然后除以边数 ”任意两点之间的距离“ 和怎么算&#xff1f; 我们去考虑边的贡献情况&#xff1a; 对于边(u,v)&…

Ocelot 资源汇总

前言最近一两年.NET Core的关注度持续上升, 微服务及云原生应用开发上采用.NET Core也越来越多&#xff0c;Ocelot 作为.NET Core平台下一款开源的API 网关开发库越来越得到社区的认可&#xff0c;应用到生产中的案例也有好几百了。春节抽空整理了现有网上公开的Ocelot相关的资…

P6698-[BalticOI 2020 Day2]病毒【AC自动机,dp,SPFA】

正题 题目链接:https://www.luogu.com.cn/problem/P6698 题目大意 有一个包含0∼G−10\sim G-10∼G−1的字符集&#xff0c;其中有nnn种变换&#xff0c;能够将一个字符ai(ai>1)a_i(a_i>1)ai​(ai​>1)变为一串字符bib_ibi​&#xff0c;当一个字符串中只剩下000和1…

[TJOI2017]城市(未解决)

[TJOI2017]城市 题意&#xff1a; 一棵树&#xff0c;现在要求你将一条边改变他的位置&#xff0c;&#xff08;即改变左右所连接的端点&#xff0c;权值不变&#xff09;&#xff0c;修改后任意两点相互可达&#xff0c;且使得两个点之间的最大交通费用最小 题解: 有O(n^2…

数论三之组合数学Ⅰ-Max-Min Sums,Binomial Coefficient is Fun,Strivore,Bubble Sort,放棋子,LOJ6671,Iroha and a Grid

组合计数我最爱Max-Min SumsdescriptionsolutioncodeBinomial Coefficient is FundescriptionsolutioncodeStrivoredescriptionsolutioncodeBubble Sortdescriptionsolutioncode[HAOI2016]放棋子descriptionsolutioncodeEntropyIncreaser 与 MinecraftdescriptionsolutioncodeD…

12.15模拟:总结

前言 20分 《好耶》 很好的把所有错误都犯了一遍。 8&#xff1a;30写完AB题 11&#xff1a;00还是只写完AB题, T1代码没有提交 T2数组算错空间全RE T3快结束了发现CE了删掉第二档后还交成了之前写的失败版本(结果靠这破玩意水到了仅有的20分) T4考场其实猜到了结论但没证出来…

语言之争与读书有感

移动互联网无处不在的今天&#xff0c;不同的学习方式让我们受益颇多。有人喜欢通过手机阅读各类技术专家的公众号分享&#xff1b;有人喜欢通过逛逛不同的博客&#xff0c;来了解当前时下的技术&#xff1b;也有人喜欢通过社区的形式&#xff0c;跟优秀的导师们一起梳理和发展…

CF566E-Restoring Map【bitset】

正题 题目链接:https://www.luogu.com.cn/problem/CF566E 题目大意 有一棵树&#xff0c;但是你不知道它的形态。你现在只知道距离每个点距离不超过222的点集&#xff0c;但是你不知道每个点集是对应哪个点的。 现在要你求这棵树。 2≤n≤10002\leq n\leq 10002≤n≤1000 解…

所有人都可以是开发人员——《Office 365开发入门指南》视频教程即将上市

今天是春节假期的最后一天&#xff0c;在这里给全国的朋友们拜个晚年&#xff0c;祝大家身体健康&#xff0c;晚年幸福啊。这个春节大家过的怎么样啊&#xff0c;我自己是在老家过的年&#xff0c;家乡的年味还是比较浓的&#xff0c;也再次感谢朋友圈的大家给我看了各地的风光…