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 ...
随机推荐
- Mysql 通用知识 2019-03-27
充电mysql 官网 https://www.mysql.com/ 以上是mysql的产品线,多数是收费的.只有社区版是免费的. 所以下面只说社区版community. MySQL Community ...
- python_requests官方文档中文版
http://cn.python-requests.org/zh_CN/latest/
- PHP工程师必备知识整理
一.http/https协议,tcp/ip协议,websocket,session,cookie 二.php:oop,thinkphp5,laravel 三.mysql.memcache.redis ...
- CentOS7.4用yum安装并配置MySQL5.7
1.配置YUM源 下载MySQL源安装包 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 安装MySQ ...
- Kotlin 枚举类
枚举类最基本的用法是实现一个类型安全的枚举. 枚举常量用逗号分隔,每个枚举常量都是一个对象. enum class Color{ RED,BLACK,BLUE,GREEN,WHITE } 枚举初始化 ...
- java.lang.ClassNotFoundException: javax.servlet.SessionCookieConfig
使用 MockMvc 模拟进行单元测试时出现以下的错误,网上看到的资料应该是说Spring4.0需要servlet3.0的支持? 在pom.xml更改servlet的版本依赖后即可
- 无法添加注解@Resource
Spring项目中缺少javax.annotation包的依赖
- MySQL 存储过程 if语句
MySQL 存储过程 if语句 MySQL IF语句允许您根据表达式的某个条件或值结果来执行一组SQL语句. 要在MySQL中形成一个表达式,可以结合文字,变量,运算符,甚至函数来组合.表达式可以返 ...
- 调节kafka消费信息的大小
Kafka设计的初衷是迅速处理短小的消息,一般10K大小的消息吞吐性能最好(可参见LinkedIn的kafka性能测试).但有时候,我们需要处理更大的消息,比如XML文档或JSON内容,一个消息差不多 ...
- 自动车牌识别(ALPR)---https://blog.csdn.net/ELEVEN_ZOU/article/details/80893579
1.基本功能:从一张或者一系列的图片中提取车牌信息,比如车牌号码.车牌颜色等信息. 2.功能扩展:车型.车品牌.车牌类型等. 3.应用方向:电子交易系统(停车自动收费.收费站自动支付等).交通执法.交 ...