EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
前言
本篇是上一篇EFCore Lazy Loading + Inheritance = 干净的数据表 (一) 【献给处女座的DB First程序猿】 前菜 的续篇。这一篇才是真的为处女座的DB First程序猿准备的正餐。
继续上一篇的话题,我们希望用EFCore,且继续使用与逻辑设计的β角偏差很少的数据表结构,彻底不想看到那种“装饰墙”的效果。
提醒一下,这一部分,属于有点”走火入魔“的性质。因为是要回过头来改动类的代码(稍微改动逻辑设计)来迁就数据表(物理设计),通过达到平衡点,来实现处女座们希望看到的“完美“结果。
本篇的程序,可以在 https://github.com/kentliu2007/EFCoreDemo/tree/master/InheritanceWithEntitySplit 下载。建议大家可以下载之后对照着程序来阅读本篇(我用的是VS2017)。
直接配置EFCore的DBContext可行否?
我们能否通过在DBContext里面配置好Entity和数据表的关系,是否就可以?
看下面的程序:
- DBContext:
- Unit Test:
实际上,出错的话,Unit Test才可以通过。所以基于这样的结果,我们知道,没戏。
拉倒吧。哪怕我们已经很认真地配置好了Entity和数据表的关系。已经精确到每个字段级别都没有漏了。
结果其实程序会报错的。不信?跑跑Unit Test就知道了。
用EFCore Lazy Loading来实现吧
有什么办法来实现?
还记不记得我的博客里面有一篇如何用EFCore Lazy Loading实现Entity Split?在这一篇里面,我们用了 Lazy Loading的功能,用walk around的方式实现了 entity split。
这个walk around的思路,我们可以借鉴用起来:
- 对Students和Teachers数据表,我们可以建立两个对应的类,分别弄个InternalStudent和InternalTeacher的类。
- DBContext里面,设置好InternalStudent以及InternalTeacher的映射关系
- Student / Teacher 类特有的属性,我们用Lazy Loading的方式,在getter/setter里面,改为访问上述InternalStudent / InternalTeacher实例所对应的属性。
数据表和程序
数据表
表的索引和俩外键,和上一篇差不多,就不骗篇幅了。
( 如果拿着这个数据表和一开始的逻辑设计比较,我们又会发现出现了偏差很小的β角彩蛋 )- Solution
- 程序
- User
- InternalStudent
- Student
- InternalTeacher和Teacher的程序和InternalStudent以及Student差不多思路,就不骗篇幅了。
- DBContext
- Unit Test
- Demo数据
- User
搞定了。
就这样,用walk around的做法,实现了“完美”的平衡点,让处女座的DB First er程序猿不再纠结。还可以吧? :-P
结语
这种walk around的做法,虽然有点走火入魔,但是在 EFCore更好地支持类继承,或者Entity Split之前,咱们先凑合着用起来吧。
相信随着EFCore版本的不断更新,"面包会有的,牛奶会有的,一切都会有的。"。
EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】的更多相关文章
- EFCore Lazy Loading + Inheritance = 干净的数据表 (一) 【献给处女座的DB First程序猿】
前言 α角 与 β角 关于α角 与 β角的介绍,请见上文 如何用EFCore Lazy Loading实现Entity Split. 本篇会继续有关于β角的彩蛋在等着大家去发掘./斜眼笑 其他 本篇的 ...
- 如何用EFCore Lazy Loading实现Entity Split
α角 与 β角 支持 现实生活 的 计算机系统,总有着两大偏差,第一个是 现实生活 与 计算机系统 的α角,另外一个是计算机系统的 逻辑设计 与 物理设计 的β角.举个栗子: α角:假设某个公司的商业 ...
- Entity Framework加载相关实体——延迟加载Lazy Loading、贪婪加载Eager Loading、显示加载Explicit Loading
Entity Framework提供了三种加载相关实体的方法:Lazy Loading,Eager Loading和Explicit Loading.首先我们先来看一下MSDN对三种加载实体方法的定义 ...
- MySQL创建数据表
* 创建数据表 * * * 一.什么是数据表 * * * * 二.创建数据表的SQL语句模型 * * DDL * * ...
- MySQL:数据表基本操作
数据表基本操作 注意点: 1.数据表中已经有数据时,轻易修改数据类型,有可能因为不同的数据类型的数据在机器 中存储的方式及长度并不相同,修改数据类型可能会影响到数据表中已有的数据类型. 2. 数据表 ...
- 制作mysql大数据表验证覆盖索引
昨天跟同事聊起数据表性能的问题,能不能仅用覆盖索引实现数据的汇总统计.找了一个开发环境已有的数据表进行测试,通过explain命令,能看到mysql通过覆盖索引就能实现sum的需求,而无须去读取实际行 ...
- python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...
- Django之路:模型(数据库)和自定义Field以及数据表的更改
一.Django 模型(数据库) Django模型是与数据库相关的,与数据库相关的代码一般写在models.py中,Django支持sqlite3,MySQL,PostgreSQL等数据库,只需要在s ...
- Django 数据表更改
Django 数据表更改 « Django 开发内容管理系统(第四天) Django 后台 » 我们设计数据库的时候,早期设计完后,后期会发现不完善,要对数据表进行更改,这时候就要用到本节的知识. D ...
随机推荐
- SonarQube安装文档
1.SonarQube 1.1 SonarQube介绍 SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误. SonarQube是否可以使用自定义规则由开发人员的开 ...
- 【搬运工】修改mysql数据库的时区
转载:https://blog.csdn.net/huangyuehong914/article/details/81742039 --------------------- ------------ ...
- Java基础知识盘点(二)- 集合篇
List和Set区别 List和Set都是继承Collection接口 List特点:元素有放入顺序,元素可重复 Set特点:元素无放入顺序,元素不可重复 Set和List对比: Set:检索元素效率 ...
- 小程序之 swiper高度根据图片高度变化
今天做的是这个效果⬇️ swiper的高度根据图片的高度而改变 wxml:<swiper indicator-dots="{{indicatorDots}}" vertic ...
- windows主用python3 个别程序使用python2的方法
原始需求: 平时执行命令都默认用python3,遇到个别程序需要python2的时候也能用python2. 实现: 1.先装python3,添加环境变量,这时在cmd里输入python可以显示出是版本 ...
- Xilinx Vivado的使用详细介绍(3):使用IP核
ilinx Vivado的使用详细介绍(3):使用IP核 Author:zhangxianhe IP核(IP Core) Vivado中有很多IP核可以直接使用,例如数学运算(乘法器.除法器.浮点运算 ...
- 使用http服务提供yum源
1.安装httpd yum -y install httpd systemctl start httpd systemctl enable httpd 2.镜像资源目录拷贝至http的网站根目录 /v ...
- cron定时任务
1.确认系统安装了cron rpm -aq | grep crontabs 2.认识cron时间格式 3.生成定时任务 crontab -e #进入任务命令编辑模式 30 7,12,20 * * * ...
- Django的form表单
html的form表单 django中,前端如果要提交一些数据到views里面去,需要用到 html里面的form表单. 例如: # form2/urls.py from django.contrib ...
- Django web框架-----Django连接本地现有mysql数据库
第一步:win10下载mysql5.7压缩包配置安装mysql,创建数据库或导入数据库 第二步:win10搭建django2.1.7开发环境,创建项目为mytestsite,创建应用app为quick ...