“幕后英雄”之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随笔】相关推荐
- Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】
接着上一篇Shadow Properties之美(一),我们来继续举一个有点啰嗦的栗子. 先看简单需求:某HR系统,需要记录员工资料.需要记录的资料有: 员工号(规则:分公司所在城市拼音首字母,加上三 ...
- Shadow Properties之美(一)【Microsoft Entity Framework Core随笔】
最近在做公司的项目的时候,开始把部分程序迁移到EF Core,然后有了一些感触,趁着还没忘却,还是先记录下来. EF Core还在成长中,我写这个的时候,版本是2.2.如果对着已有的EF 5/6来说, ...
- Entity Framework Core 1.1 升级通告
Entity Framework Core(EF Core)是一个轻量级的,可扩展和实体框架的跨平台版本.今天,我们宣布 Entity Framewor Core 1.1 正式可用了. EF Core ...
- Entity Framework Core 2.0 使用入门
本文转载自作者:晓晨Master(李志强) 原文章地址 https://www.cnblogs.com/stulzq/p/7717873.html 一.前言 Entity Framework(后面简称 ...
- Entity Framework Core介绍(1)
介绍 Entity Framework (EF) Core 是轻量化.可扩展和跨平台版的常用 Entity Framework 数据访问技术. EF Core 可用作对象关系映射程序 (O/RM),以 ...
- oracle精简版_使用Entity Framework Core访问数据库(Oracle篇)
前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...
- 在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句
在开发中,我们想在调试中查看EF Core执行的sql语句,可以使用SQL Studio Manager Tools工具,另一种方式是使用EF Core提供的日志.在ASP.NET Core使用Ent ...
- 使用Entity Framework Core访问数据库(DB2篇)
上一篇讲了一些EF Core访问Oracle的坑.(感兴趣请移步:使用Entity Framework Core访问数据库(Oracle篇)) 这篇主要讲一下关于EF Core访问DB2的一揽子~问题 ...
- 使用Entity Framework Core访问数据库(Oracle篇)
前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架 终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...
最新文章
- 安装工程造价课程设计_造价课程设计.docx
- Javascript框架的自定义事件(转)
- 系统服务有多个mysql_windows系统中安装多个Mysql服务
- E - Code Parsing CodeForces - 255B(思维)
- 高性能的MySQL(2)慢查询
- 北理乐学c语言基础答案晕,北理乐学C语言答案.doc
- scrot usage
- 基于时间片的高优先级调度_CFS调度器(1)-基本原理
- 轻松解决ArcGIS Pro 安装中文汉化包或离线帮助文档时报错“指定路径为空”
- 良心安利草皮3d纹理图片素材网站
- 抖音为何能一夜爆火?
- 安卓开发良好的习惯(想到就更新)
- USB声卡噪音问题,USB声卡中文名设置,基于STM32F411
- zookeeper 启动失败,报错 “ZooKeeper JMX enabled by default”
- PHP preg_match()函数
- 我学习Javascript的心得体会与Javascript的小总结
- spring cron表达式及解析过程
- 机器学习案例之:甲状腺射频消融数据模型
- Springboot+Thymeleaf中常用的th标签
- 百度拼音输入法2014官方版
热门文章
- windows10访客_如何在Windows 10中创建访客帐户
- Tomcat定义虚拟主机案例
- 【转】 ConstraintLayout 完全解析 快来优化你的布局吧
- swift学习笔记-----swift中的指针
- c++ memcpy与strcpy的比较
- 在Ajax程序中实现无刷新换肤功能(asp.net2.0)
- 在 Azure VM 上使用 Jitsi 搭建私人视频会议
- 如何绕过 TPM 2.0 安装 Windows 11 操作系统?
- 技术分享|手机推送原理剖析指南
- 记一次 .NET 某教育系统 异常崩溃分析