接着上一篇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。敬请期待噢。。。

Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】的更多相关文章

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

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

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

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

  3. Entity Framework Core 1.1 Preview 1 简介

    实体框架核心(EF Core)是Entity Framework的一个轻量级,可扩展和跨平台版本. 10月25日,Entity Framework Core 1.1 Preview 1发布了. 升级到 ...

  4. Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 创建复杂数据模型

    Creating a complex data model 创建复杂数据模型 8 of 9 people found this helpful The Contoso University sampl ...

  5. Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 排序、筛选、分页以及分组

    Sorting, filtering, paging, and grouping 7 of 8 people found this helpful By Tom Dykstra The Contoso ...

  6. Working with Data » 使用Visual Studio开发ASP.NET Core MVC and Entity Framework Core初学者教程

    原文地址:https://docs.asp.net/en/latest/data/ef-mvc/intro.html The Contoso University sample web applica ...

  7. Professional C# 6 and .NET Core 1.0 - 38 Entity Framework Core

    本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - 38 Entity Framework ...

  8. Entity Framework Core 生成跟踪列

    本文翻译自<Entity Framework Core: Generate tracking columns>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意:我使用的是 ...

  9. Entity Framework Core 2.0 使用入门

    一.前言 Entity Framework(后面简称EF)作为微软家的ORM,自然而然从.NET Framework延续到了.NET Core.以前我也嫌弃EF太重而不去使用它,但是EF Core(E ...

随机推荐

  1. 一.MySQL安装

    版本:linux7.6 一.编译安装 1.下载epel源 [root@db01 ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyu ...

  2. (转)A Recipe for Training Neural Networks

    A Recipe for Training Neural Networks Andrej Karpathy blog  2019-04-27 09:37:05 This blog is copied ...

  3. 比原链(Bytom)先知节点 Ubuntu接入文档

    系统要求 我们建议选择知名的VPS服务商,运行比原链节点对算力没有要求,但是请配置尽可能大的磁盘空间. 节点服务器最小配置: 操作系统: Windows/Linux/Docker CPU: 2核 内存 ...

  4. JVM即时编译器

    为何HotSpot虚拟机要使用解释器与编译器并存的架构? 为何HotSpot虚拟机要实现两个不同的即时编译器? 程序何时使用解释器执行?何时使用编译器执行? 哪些程序代码会被编译为本地代码?如何编译为 ...

  5. linux命令行安装teamviewer

    teamviewer最新版本为14,但是Ubuntu14.04不支持,安装13版本即可. sudo dpkg -i teamviewer_13.2.26559_amd64.deb若报错,即缺少依赖,运 ...

  6. 浏览器输入URL后,HTTP请求返回的完整过程

    1.Redirect,跳转    浏览器记录里这个地址永久跳转的新地址,浏览器先去判断需不需要跳转 2.Application cache ,应用缓存    浏览器看请求的资源是否有缓存 3.DNS解 ...

  7. 【python 3】 列表方法操作汇总

    基础数据类型 : list list主要操作:索引.切片.查询.修改.增加.删除.扩展.统计.排序.获取下标.拷贝…… 1.1  索引  由图: list正向下标从0开始 list反向下标从-1开始 ...

  8. 小程序之 微信小程序下拉上方出现空白

    往下拉页面后上方出现空白区域  用户需要手动划上去才能消失 方法一:"enablePullDownRefresh":false //这个在page.json中配置 整个页面都不能滑 ...

  9. Keras + LSTM 做回归demo

    学习神经网络 想拿lstm 做回归, 网上找demo 基本三种: sin拟合cos 那个, 比特币价格预测(我用相同的代码和数据没有跑成功, 我太菜了)和keras 的一个例子 我基于keras 那个 ...

  10. AutoField的话就报错:'AutoField' object has no attribute 'rel'

    def data_inspect(self, data, extra=None): if isinstance(data, (QuerySet, Page, list)): convert_data ...