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

前言

本篇是上一篇EFCore Lazy Loading + Inheritance = 干净的数据表 (一) 【献给处女座的DB First程序猿】 前菜 的续篇。这一篇才是真的为处女座的DB First程序猿准备的正餐。
继续上一篇的话题,我们希望用EFCore,且继续使用与逻辑设计的β角偏差很少的数据表结构,彻底不想看到那种“装饰墙”的效果。
提醒一下,这一部分,属于有点”走火入魔“的性质。因为是要回过头来改动类的代码(稍微改动逻辑设计)来迁就数据表(物理设计),通过达到平衡点,来实现处女座们希望看到的“完美“结果。

本篇的程序,可以在 

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

直接配置EFCore的DBContext可行否?

我们能否通过在DBContext里面配置好Entity和数据表的关系,是否就可以?
看下面的程序:

  • DBContext:
    640?wx_fmt=png

  • Unit Test:
    640?wx_fmt=png
    实际上,出错的话,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实例所对应的属性。

数据表和程序
  • 数据表
    640?wx_fmt=png
    表的索引和俩外键,和上一篇差不多,就不骗篇幅了。
    ( 如果拿着这个数据表和一开始的逻辑设计比较,我们又会发现出现了偏差很小的β角彩蛋 )

  • Solution
    640?wx_fmt=png

  • 程序

    • User
      640?wx_fmt=png

    • InternalStudent
      640?wx_fmt=png

    • Student
      640?wx_fmt=png

    • InternalTeacher和Teacher的程序和InternalStudent以及Student差不多思路,就不骗篇幅了。

    • DBContext
      640?wx_fmt=png

    • Unit Test
      640?wx_fmt=png

    • Demo数据
      640?wx_fmt=png


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

结语

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

相关文章:


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

 
 

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值