前言

本篇是上一篇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数据

搞定了。
就这样,用walk around的做法,实现了“完美”的平衡点,让处女座的DB First er程序猿不再纠结。还可以吧? :-P

结语

这种walk around的做法,虽然有点走火入魔,但是在 EFCore更好地支持类继承,或者Entity Split之前,咱们先凑合着用起来吧。
相信随着EFCore版本的不断更新,"面包会有的,牛奶会有的,一切都会有的。"。

EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】的更多相关文章

  1. EFCore Lazy Loading + Inheritance = 干净的数据表 (一) 【献给处女座的DB First程序猿】

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

  2. 如何用EFCore Lazy Loading实现Entity Split

    α角 与 β角 支持 现实生活 的 计算机系统,总有着两大偏差,第一个是 现实生活 与 计算机系统 的α角,另外一个是计算机系统的 逻辑设计 与 物理设计 的β角.举个栗子: α角:假设某个公司的商业 ...

  3. Entity Framework加载相关实体——延迟加载Lazy Loading、贪婪加载Eager Loading、显示加载Explicit Loading

    Entity Framework提供了三种加载相关实体的方法:Lazy Loading,Eager Loading和Explicit Loading.首先我们先来看一下MSDN对三种加载实体方法的定义 ...

  4. MySQL创建数据表

    *  创建数据表 * *       *      一.什么是数据表 * *           * *      二.创建数据表的SQL语句模型 * *          DDL * *       ...

  5. MySQL:数据表基本操作

    数据表基本操作 注意点: 1.数据表中已经有数据时,轻易修改数据类型,有可能因为不同的数据类型的数据在机器 中存储的方式及长度并不相同,修改数据类型可能会影响到数据表中已有的数据类型. 2.  数据表 ...

  6. 制作mysql大数据表验证覆盖索引

    昨天跟同事聊起数据表性能的问题,能不能仅用覆盖索引实现数据的汇总统计.找了一个开发环境已有的数据表进行测试,通过explain命令,能看到mysql通过覆盖索引就能实现sum的需求,而无须去读取实际行 ...

  7. python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

    python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...

  8. Django之路:模型(数据库)和自定义Field以及数据表的更改

    一.Django 模型(数据库) Django模型是与数据库相关的,与数据库相关的代码一般写在models.py中,Django支持sqlite3,MySQL,PostgreSQL等数据库,只需要在s ...

  9. Django 数据表更改

    Django 数据表更改 « Django 开发内容管理系统(第四天) Django 后台 » 我们设计数据库的时候,早期设计完后,后期会发现不完善,要对数据表进行更改,这时候就要用到本节的知识. D ...

随机推荐

  1. centos7 安装pgsql

    1.添加prm安装源(或者从官网下载) PostgreSQL官网地址:https://yum.postgresql.org/ yum install https://download.postgres ...

  2. ios高级开发之多线程(一)

    1.概念: 多线程(multithreading)到底是什么呢,它是指在软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件的支持,而能够在同一时间执行多个线程,进而提升整体处理性 ...

  3. ES6解构过程添加一个默认值和赋值一个新的值

    const info = { name: 'xiaobe', } const { name: nickName = '未知' } = info; 其中nickName是解构过程中新声明的一个变量,并且 ...

  4. put与putIfAbsent区别

    put与putIfAbsent区别: put在放入数据时,如果放入数据的key已经存在与Map中,最后放入的数据会覆盖之前存在的数据, 而putIfAbsent在放入数据时,如果存在重复的key,那么 ...

  5. virtual box centos7 common operation

    ======= network part =======1.设置桥接模式 2.vi /etc/sysconfig/network-scripts/ifcfg-enp0s3BOOTPROTO=stati ...

  6. winform使用log4.net

    因为我最近负责的Winform项目,好多都用到了这个log4net的日志功能,开发程序对数据一般都要求做到雁过留痕,所以日志对于我们程序员是不可或缺.因此我把对log4net的使用做一个记录总结,以便 ...

  7. vivo 1805的usb调试模式在哪里,开启vivo 1805usb调试模式的流程

    经常我们使用安卓手机通过数据线连接上PC的时候,如果手机没有开启usb调试模式,PC则没办法成功识别我们的手机,部分软件也没办法正常使用,此情况我们需要找方法将手机的usb调试模式打开,下面我们讲解v ...

  8. ubuntu下安装 java环境

    步骤1:下载jdk 我选择的jdk版本文件: jdk-8u201-linux-x64.tar 官网下载链接 步骤2:创建单独的目录 sudo mkdir /usr/local/java 步骤3:将下载 ...

  9. 设置RHEL-7.0的运行级别

    在RHEL7中修改默认运行级别与7以前版本的修改方式不同(7以前版本可以修改/etc/inittab中的“id:5:initdefault:”参数值来实现),RHEL7在/etc/inittab文件中 ...

  10. SVN-Failed to run the WC DB work queue associated with

    解决方法:清空svn的队列 1.下载sqlite3.exe 2.找到你项目的.svn文件,查看是否存在wc.db 3.将sqlite3.exe放到.svn的同级目录 4.启动cmd执行sqlite3 ...