接着上一篇Shadow Properties之美(一),我们来继续举一个有点啰嗦的栗子。
先看简单需求:某HR系统,需要记录员工资料。需要记录的资料有:

  • 员工号(规则:分公司所在城市拼音首字母,加上三位的顺序数字,例如 GZ001,CD001,SH007等;对于每个员工有且仅有一个员工号,且不会存在同一员工号属于不同员工的情况);

  • 姓;

  • 名;

  • 最后一次入职日期(有些员工可能会有来来回回超过一次的入职离职再入职,保存最后一次就好)

  • 其他。。。
    在继续讨论之前,会用到有关 逻辑设计 和 物理设计 的概念,它们两者的区别,建议可以先阅读一下 https://it.toolbox.com/blogs/timbryce/logical-vs-physical-design-do-you-know-the-difference-050306 ,然后我们再继续。
    针对这个需求,我们简单地会有以下这样逻辑设计的类:

    其中EmployeeCode就是 Unique Identifier (唯一标识符)
    (本篇的程序,可以在这里下载:https://github.com/kentliu2007/EFCoreDemo/tree/master/ShadowProperty 用的是VS 2017)
    并且习惯性地会有按照 Default大法,有以下的数据表以及程序:

  • 数据表:



    虽然default大法好,而且还可以借口 “用自增长ID来做主键,可以加快数据库做join的时候的速度”,所以才没有用 EmployeeCode来做主键(虽然这个才是Unique Identifier)。。。但是我们还是需要做一些不是完全default的改动,仔细看上面绿色标识的内容,请留意clustered index以及unique key。

  • 演示数据:

  • 然后我们还有比较传统的基于EF6的WebApi:








    图有点多,但是因为都按照 default 大法 来捣弄的。一切都很简单很溜,对吧?

不过等等,画风有点不对,负责BDD的同事(不论是SME/BA/QC)可能会跳起来,如果我们要查询员工号是 SH007 的员工,为什么是 http://localhost:62021/api/Employees/3 ?如果换个DB,手动操作一下,或者测试并发量大的前提下,说不定要 http://localhost:62021/api/Employees/250 才是 SH007的数据了。如果换成是用GUID来做ID字段的,就可能会有类似这样的:http://localhost:62021/api/Employees/85a13f20-2d3e-4a21-807d-c64f5a55a626 ,这个又是什么鬼?其他系统call这个api的时候,或者BDD的案例描述是:查询员工号是SH007的员工的资料。。。但是我怎么知道你这个DB里面,ID是什么数字(如果是GUID的话,鬼知道又是个什么冰糖葫芦串)?麻烦请说人话好不好?这种逻辑设计里面本来就没有的,由于物理设计才出现的东西,DataAccess层,请你自己留着和数据库两个慢慢玩,不要漏出来给其他层好不好?
还有,俩Employee的类,有点拖沓了吧?

好吧,为了保持跟逻辑层一致,并且不想要两个employee类,继续使用EF6,我们会有第二个版本:






这下画风正常了。不过一堆模块都需要引用或者基于 DataAccess 模块;还有虽然只有一个employee类了,但是还要加上一些其他internal的属性。。。总感觉还是做得不够优雅(混了牛奶和糖的美式啊)。

现在有了EF Core的Shadow Property,我们可以把这个做得很优雅(鼓掌)。Shadow Property就是让我们可以保持 逻辑设计层 美式的纯正,然后让 DataAccess层 可以处理和消化掉 物理设计层 特有的元素:






看,一切都很 “美式” 的优雅,不存在骗奶骗糖的感觉:从Component Diagram来看,各个模块都引用着正确的逻辑设计模块;DataAccess模块没有需要多产生一个拖沓的EF类;外部系统以及人机对话的时候,都是针对逻辑设计来交谈,且说的都是人话。

本篇图有点多,建议结合下载的源代码来阅读本文。

希望通过上述两个栗子,让大家能够感受到Shadow Property的美,且能在工作中更灵活地把它用起来。
谢谢能耐着性子看到这里的大神们。请温柔一点吐槽哈。

下一篇,我计划向大家介绍一下EF Core的一个“幕后英雄” -- Backing Fields。敬请期待噢。。。

原文地址:https://www.cnblogs.com/fatkent/p/10333487.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】相关推荐

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

    刘德华 有一首歌叫<马桶>,其中有一句歌词是:每一个马桶都是英雄. EFCore也有一个英雄,在幕后默默地任劳任怨.它就叫 "支持字段" (Backing Fields ...

  2. Shadow Properties之美(一)【Microsoft Entity Framework Core随笔】

    最近在做公司的项目的时候,开始把部分程序迁移到EF Core,然后有了一些感触,趁着还没忘却,还是先记录下来. EF Core还在成长中,我写这个的时候,版本是2.2.如果对着已有的EF 5/6来说, ...

  3. Entity Framework Core 2.0 使用入门

    本文转载自作者:晓晨Master(李志强) 原文章地址 https://www.cnblogs.com/stulzq/p/7717873.html 一.前言 Entity Framework(后面简称 ...

  4. Entity Framework Core 2.0 使用代码进行自动迁移

    一.前言 我们在使用EF进行开发的时候,肯定会遇到将迁移更新到生产数据库这个问题,前面写了一篇文章介绍了Entity Framework Core 2.0的入门使用,这里面介绍了使用命令生成迁移所需的 ...

  5. Entity Framework Core Like 查询揭秘

    在Entity Framework Core 2.0中增加一个很酷的功能:EF.Functions.Like(),最终解析为SQL中的Like语句,以便于在 LINQ 查询中直接调用. 不过Entit ...

  6. Entity Framework Core 2.0 特性介绍和使用指南

    前言 这是.Net Core 2.0生态生态介绍的最后一篇,EF一直是我喜欢的一个ORM框架,随着版本升级EF也发展到EF6.x,Entity Framework Core是一个支持跨平台的全新版本, ...

  7. Entity Framework Core 生成跟踪列

    注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final).正式版发布时,功能可能存在变动. 当您设计数据库时,有时需要添加列以跟踪记录何时更改 ...

  8. 在Apworks数据服务中使用基于Entity Framework Core的仓储(Repository)实现

    <在ASP.NET Core中使用Apworks快速开发数据服务>一文中,我介绍了如何使用Apworks框架的数据服务来快速构建用于查询和管理数据模型的RESTful API,通过该文的介 ...

  9. Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制

    将通用的序列号生成器库 从SQL Server迁移到Mysql 遇到的一个问题,就是TimeStamp/RowVersion并发控制类型在非Microsoft SQL Server数据库中的实现.SQ ...

最新文章

  1. 【入门篇】如何正确使用机器学习中的训练集、验证集和测试集?
  2. 编译安装SVN不结合apache
  3. 生成有关 SQL Server 2005 Analysis Services 多维数据集数据源的本地化报表
  4. 0X8009310B (ASN:276) win7安装证书时出现错误消息:找不到与此证书文件相关联的证书申请微软官方文档
  5. 执行虚拟机mysql脚本_mysql一键执行脚本 超方便!!!
  6. nginx windows 下安装和配置
  7. Netty工作笔记0042---Netty入门--编写客户端
  8. 数据结构上机实践第11周项目2 - 操作用邻接表存储的图
  9. P1868 饥饿的奶牛
  10. 【优化调度】基于matlab粒子群算法求解水火电调度优化问题【含Matlab源码 1181期】
  11. 易居IPO后首份成绩单透露了什么秘密?|一点财经
  12. 多个图像直方图合并matlab,MATLAB图像处理之直方图匹配(图像合理增强)
  13. 2021年低压电工新版试题及低压电工考试总结
  14. 电容式触摸感应按键解决方案AD
  15. linux下运行icem脚本,肿么安装linux版的icem
  16. 用MODIS数据借助MATLAB绘制世界植被分布图
  17. 微信移动学习平台小程序 后台基于php+mysql
  18. excel单元格一分为二还要输入文字,不能编辑是什么原因?
  19. andriod studio实现界面切换
  20. sinx/x的极限为什么是1_lim(x趋向0)sinx/x为什么等于1?

热门文章

  1. 使用Ubuntu的公用文件夹轻松地在计算机之间共享文件
  2. 精通Java设计模式从初见到相爱之工厂+策略模式(3)
  3. 二狗叫你制作千M网线的线序及方法
  4. 助力 .NET MAUI Community Toolkit
  5. 别等了,全面「远程办公」凉了
  6. C# WPF MVVM项目实战(进阶①)
  7. C# 常用接口学习 IEnumerableT
  8. 明源云·天际,地产⾏业的Salesforce Lightning Platform
  9. asp.net core监控—引入Prometheus(二)
  10. .Net Core 2.2升级3.1的避坑指南