EFCore Lazy Loading + Inheritance = 干净的数据表 (一)

前言

α角 与 β角

关于α角 与 β角的介绍,请见上文 如何用EFCore Lazy Loading实现Entity Split。
本篇会继续有关于β角的彩蛋在等着大家去发掘。/斜眼笑

其他

  • 本篇的程序,可以在 https://github.com/kentliu2007/EFCoreDemo/tree/master/InheritanceWithEntitySplit 下载。建议大家可以下载之后对照着程序来阅读本篇(我用的是VS2017)。

  • 由于篇幅比较长,为了方便阅读,本篇分成两个部分。如果耐着性子看完第一部分,而不是处女座/不是DB First er的,可以止步,不需要继续看第二部分了。

需求

我们先来看看需求:

  • 某校园的一个人员资料系统,其中可登录用户有两种:教师和学生。每个可登录用户具有以下属性:

    • 用户登录名 (该系统用户的唯一标识值)

    • 密码

  • 教师。系统需要记录 教师 的以下属性:

    • 教职工号码 (某校园里,该教师的唯一标示值)

    • 工资级别 (自编的工资级别)

  • 学生。系统需要记录 学生 的以下属性:

    • 学生编号 (某校园里,该学生的唯一标示值)

    • 学生就读年级

逻辑设计

根据上述需求,我们会有以下这样的类的设计:
640?wx_fmt=png
上述设计还有一个一点点不同的版本:
640?wx_fmt=png

物理设计

从逻辑设计到物理设计,会由于我们选择的具体的实现方式而产生一定的偏差。例如,不同厂商的数据库引擎,或者不选用数据库引擎而选用其他的产品(MQ或者NoSQL类产品),甚至不同的ORM产品,都会引致偏差的发生。

用EF6怎么实现

下面我们从DB First er的角度,直接根据上述的逻辑设计,设计出数据表。然后再看看用EF6如何实现。

数据表

640?wx_fmt=png

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

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

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

  • FK_Students_Users的设置
    640?wx_fmt=png

  • FK_Teachers_Users的设置
    640?wx_fmt=png

EF Model

在各种wizard的帮助下,逆向工程后,我们需要做一些小改动,删掉某些Property,以及Navigation Property,然后把 Inheritance 关系拉好。并且转换一下 User.UserType为Enum UserTypes。
于是我们就有了这样的 EF Model:
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=jpeg
(第一个β角的彩蛋,我们根据习惯,通常会把UserType设置为Enum。这个和逻辑设计有一点点偏差)
640?wx_fmt=png
640?wx_fmt=png

程序
  • Solution
    640?wx_fmt=jpeg

  • Unit Test
    640?wx_fmt=png

  • 测试数据
    640?wx_fmt=png

EF6对类的继承提供了支持,所以从类到表,然后再到EF,一切都很顺其自然,一气呵成。

用EFCore怎么实现

EFCore也提供类的继承的支持,可以在这里查看微软的文档:https://docs.microsoft.com/zh-cn/ef/core/modeling/inheritance ,以及 https://docs.microsoft.com/zh-cn/ef/core/modeling/relational/inheritance
由于EFCore更加倾向于Code First,所以我们按照文档来走一遍,然后对本篇的需求,就会有以下的产出:

程序
  • Solution
    640?wx_fmt=jpeg

  • User、Student和Teacher的程序

    public partial class User{        public string LoginName { get; set; }        public string FirstName { get; set; }        public string LastName { get; set; }        public string Password { get; set; }}    public partial class Student : User{        public string StudentCode { get; set; }        public int GradeLevel { get; set; }}    public partial class Teacher : User{        public string StaffCode { get; set; }        public int SalaryGrade { get; set; }}
  • DBContext的程序
    640?wx_fmt=png

  • Unit Test程序
    640?wx_fmt=png

数据表

有了上述的程序,我们跑一下Migration命令,于是就有以下的表结构

  • Migration命令
    640?wx_fmt=png

  • 表结构
    640?wx_fmt=png

  • Users的索引
    640?wx_fmt=png

没有其他表了?真的没有了。用EF Core的正向工程,上述的三个父子类,它就是生成这样一个数据表,就够了。当然DBA还可能对数据表做一点改动,例如 主键不要是 聚集索引等。不过基于不骗篇幅的借口,让我们偷一下懒吧。 :-P
(第二个β角的彩蛋出现了。由于我们选用了 EF Core,物理设计的数据表,竟然和逻辑设计有着喇么大的偏差)

  • 测试数据
    640?wx_fmt=png

好吧,看起来用EFCore来实现类的继承也很简单。一切操作只需要按照教程一步步捣弄,也很直接方便。

本篇结语

上面就是EF6 和 EFCore分别怎样支持 类的继承的做法。如果你是Code First er,可以止步于此了。
如果你是处女座,或者 DB First er,

  • 你会发现EFCore正向工程后的数据表,表结构很特别,且看着测试数据的结果,会感觉是一堵装饰墙。反正就是总觉得有说不出来的违和感。

  • 你会想,有没有可能,让EFCore,用上和逻辑设计之间β角偏差最小的数据表呢?

如果你有上述的感觉和疑问,欢迎继续看下一篇EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】。

相关文章:

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

  • Shadow Properties之美(二)【Microsoft Entity Framework Core随笔】

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

  • 如何用EFCore Lazy Loading实现Entity Split

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

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


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

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

相关文章

专题突破之反悔贪心——建筑抢修,Cow Coupons G, Voting (Hard Version),Cardboard Box

文章目录[JSOI2007]建筑抢修[USACO12FEB]Cow Coupons GCF1251E2 Voting (Hard Version)CF436E Cardboard Box[JSOI2007]建筑抢修 luogu4053 将建筑按照结束时间从小到大排序 然后记录一下已经修理的建筑总共的花费时间 如果花费时间加上现在这个建筑的修建时间超过了这个建…

Max Sum Plus Plus HDU - 1024

Max Sum Plus Plus HDU - 1024 题意: 给你n个数,选m个子段,各个子段连续且不相交,长度可以为1,设maxn为各个子区间的和,求最大的maxn。 题解: 设dp[i][j]表示前j个数分成i段的最大值 对于第…

模板:杜教筛(莫比乌斯反演、数论)

所谓杜教筛,就是dms教给我们的筛 (逃) 前言 与其说算法,不如说是技巧。 可以在低于线性的时间复杂度(准确的说是 O(n23)O(n^{\frac{2}{3}})O(n32​))内完成对积性函数的前缀和计算。 解析 考虑求函数 f…

程序员过关斩将--快速迁移10亿级数据

菜菜呀,咱们业务BJKJ有个表数据需要做迁移程序员主力 Y总现在有多少数据?菜菜大约21亿吧,2017年以前的数据没有业务意义了,给你半天时间把这个事搞定,绩效给你A程序员主力 Y总有绩效奖金吗?菜菜钱的事你去问…

[2021-09-09 T2] 就差⼀点——冒泡排序和反序表之间不为人知的秘密

就差一点解题报告descriptionsolutioncodedescription 题目描述 冒泡排序是⼀个简单的排序算法,其时间复杂度为O(n2)O(n^2)O(n2) 有⼀个大小为nnn的排列p1,...,pnp_1,...,p_np1​,...,pn​,⼩明想对这个排列进⾏冒泡排序,于是写了下⾯这份…

CodeForces - 76E Points

CodeForces - 76E Points 题意&#xff1a; 给你n个点的坐标&#xff0c;求所有一对点之间的距离的平方和 n<100000 题解&#xff1a; 直接暴力n2肯定不行&#xff0c;我们把这个的式子列出来&#xff1a; 代码&#xff1a; #include<bits/stdc.h> #define deb…

模板:Miller-RabinPollard-Rho(数论)

所谓 pollard-rho&#xff0c;就是泼辣的肉 &#xff08;逃&#xff09; 前言 许多题解都把这两个算法放在了一起。 那我也这样办吧&#xff01; miller-rabin可以在优秀的时间复杂度内完成对一个数的素性检测。 而pollard-rho则是立足于Miler-rabin之上&#xff0c;可以在 …

Asp.NetCore轻松学-部署到 Linux 进行托管

前言上一篇文章介绍了如何将开发好的 Asp.Net Core 应用程序部署到 IIS&#xff0c;且学习了进程内托管和进程外托管的区别&#xff1b;接下来就要说说应用 Asp.Net Core 的特性&#xff08;跨平台&#xff09;&#xff0c;将 .NetCore 部署到 Linux 中&#xff0c;主流的 Linu…

DevC++ 用C语言的多线程 实现简单的客户端和服务器

知识来源一&#xff1a; 使用Dev-C实现简单的客户端和服务器-CSDN博客 此先生的博客使用的是win32 SDK来创建多线程&#xff0c;然后鄙人对这个版本的多线程细节不明。于是又重新用C语言的线程替代win32API,以此继续学习服务器代码。 知识来源二&#xff1a;DevC 多线程创建…

[2021-09-09 T3] 序列/luogu P3943 星空(异或差分+bfs最短路+状压dp)

序列descriptionsolutioncodedescription 题目描述 长度为nnn的序列&#xff0c;初始全为000&#xff0c;每次可以选择⼀个数ai(1≤i≤l)a_i(1\le i\le l)ai​(1≤i≤l)&#xff0c;然后选择连续aia_iai​个元素异或上111 求最少的次数&#xff0c;使得对于所有i(1≤i≤k)i(…

HDU - 4608 I-number

题意&#xff1a; 给你一个x&#xff0c;让你构造一个y&#xff0c;y的要求&#xff1a; y>xy的各项之和为10的倍数在满足前两个的前提下&#xff0c;y尽可能小 题解&#xff1a; 模拟&#xff0c;尽可能的模拟&#xff0c;用字符串模拟 先将各位相加得到sum&#xff0c…

从初创公司的角度来看微服务

在开展微服务的过程中&#xff0c;了解要考虑哪些因素可能是非常有挑战性的事情。没有可以直接使用的金科玉律。每个过程都是不同的&#xff0c;因为每个组织面临的都是不同的环境。在本文中&#xff0c;我将从初创公司的角度分享我们学习到的经验和面临的挑战&#xff0c;以及…

洛谷P2056:[ZJOI2007]捉迷藏(点分树、STL)

解析 见到动态维护最远点对&#xff0c;不难想到利用 set 维护最大值和次大值&#xff0c;每个点维护两个 set 的杂技做法。 但是问题是…T了啊。 咋办嘞。 一个在本题至关重要的 trick&#xff1a;利用两个堆来支持访问最大值和删除 具体也很好理解&#xff1a;当删除的时候…

[NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

[NOI2018] 归程descriptionsolution1code1solution2codedescription 题目描述 本题的故事发生在魔力之都&#xff0c;在这里我们将为你介绍一些必要的设定 魔力之都可以抽象成一个nnn个节点、mmm条边的无向连通图&#xff08;节点的编号从111至nnn&#xff09;我们依次用 l,…

CodeForces - 616D Longest k-Good Segment

CodeForces - 616D Longest k-Good Segment 题意&#xff1a; 有包含n个数的序列a&#xff0c;求能找到最长的区间包含不超过k个不同的元素。 题解&#xff1a; 尺取法&#xff0c;先固定L&#xff0c;然后移动R&#xff0c;R每次移动&#xff0c;当超过k后&#xff0c;L再…

MySQL 集群方案介绍

mysql集群方案这里介绍2种&#xff0c;PXC 和 Replication。大型互联网程序用户群体庞大&#xff0c;所以架构设计单节点数据库已经无法满足需求。大家也深有体会&#xff0c;有一万人在学校网站查成绩或是选课的时候网站时常是访问不了或者相应特别特别慢。这种情况就凸显出来…

模板:回文自动机(PAM)

所谓回文自动机&#xff0c;就是关于回文的自动机。 &#xff08;逃&#xff09; 前言 小清新自动机。 经历过SAM的大风大浪&#xff0c;这个相比而言好理解多了&#xff0c;感觉也许应该先学这个再学SAM… 解析 和trie、AC自动机、SAM等类似的&#xff0c;PAM的每个结点表…

Gym - 215177C 玩游戏

题意&#xff1a; ljcc和他的学妹在玩游戏&#xff0c;这个游戏共有 n 轮&#xff0c;在第 i 轮获胜会获得 i 分&#xff0c;没有平局。 现在给出ljcc和学妹的得分&#xff0c;求是否有一种方案符合当前得分。 题解&#xff1a; 第i轮得到i分&#xff0c;一共n轮&#xff0…

Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)

Zju2112 Dynamic Rankingsdescriptionsolutioncodedescription 给定一个含有n个数的序列a[1],a[2],a[3]……a[n]&#xff0c;程序必须回答这样的询问&#xff1a;对于给定的i,j,k&#xff0c;在a[i],a[i1 ],a[i2]……a[j]中第k小的数是多少(1≤k≤j-i1)&#xff0c;并且&…

ML.NET案例详解:在.NET下使用机器学习API实现化学分子式数据格式的判定

半年前写过一篇类似的文章&#xff0c;题目是&#xff1a;《在.NET中使用机器学习API&#xff08;ML.NET&#xff09;实现化学分子式数据格式的判定》&#xff0c;在该文中&#xff0c;我介绍了化学分子式数据格式的基本知识&#xff0c;同时给出了一个案例&#xff0c;展示了如…