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:
    EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
  • Unit Test:
    EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
    实际上,出错的话,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实例所对应的属性。

数据表和程序

  • 数据表
    EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
    表的索引和俩外键,和上一篇差不多,就不骗篇幅了。
    ( 如果拿着这个数据表和一开始的逻辑设计比较,我们又会发现出现了偏差很小的β角彩蛋 )

  • Solution
    EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
  • 程序
    • User
      EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
    • InternalStudent
      EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
    • Student
      EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
    • InternalTeacher和Teacher的程序和InternalStudent以及Student差不多思路,就不骗篇幅了。
    • DBContext
      EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
    • Unit Test
      EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】
    • Demo数据
      EFCore Lazy Loading + Inheritance = 干净的数据表 (二) 【献给处女座的DB First程序猿】

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

结语

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

上一篇:egret请求参数


下一篇:python爬虫期末复习