肥健

EFCore Owned Entity Types,彩蛋乎?鸡肋乎?之彩蛋篇

EFCore Owned Entity Types的定义###

EFCore Owned Entity Types的文档在这里:https://docs.microsoft.com/zh-cn/ef/core/modeling/owned-entities
不过要吐槽一下,看完第一句,我就开始严重怀疑自己的母语水平。难道我的中文真的那么差?
其实,是机器翻译的缘故啦。看完https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities 之后,就会感觉行云流水般易懂了啦。
EFCore Owned Entity Types其实是一个倾向于 Code First 的功能,它就是为了从逻辑设计上,直接支持那种 实体A 包含(或者拥有) 实体B 的场景。
例如,某人拥有一些列的联系方式、或者某人拥有一系列的银行账号以及这些账号的余额,等等。。。
下面让我们通过一个例子来看看,它为什么会被称为彩蛋。
(本篇例子的源代码,可以在 https://github.com/kentliu2007/EFCoreDemo/tree/master/OwnedEntityTypes 下载。建议可以下载之后对照着代码来阅读本篇。我用的是VS2017)

需求和类图####

假设我们的系统需要记录客户的:

  • 客户代号 (唯一标示值)
  • 客户名字
  • 手机号码
  • 固话号码
  • 邮件地址

于是我们通常会有这样的类图:

或者可能会有这样的类图:

第一种类图的设计,主要是类的属性不多的时候。而如果类属性太多(我曾经看到过在某系统里,某些类,有超过两百个属性的),那么我们通常会把这些属性,分门别类,定义出另外一些实体类(辅助类)来减轻主类的负担。
EFCore Owned Entity Types的强项,就是针对支持第二种类图而存在的。
下面让我们看看它是如何支持的

EFCore Owned Entity Types如何支持####

比较直接的,我们会根据类图,生成(或者自己写出)代码。然后顾名思义,Code First,我们会跑Migration命令,然后再通过正向工程,得到数据表。

  • 项目:

    Microsoft.EntityFrameworkCore.Tools 是CLI Tool,这个是关键,不要漏了噢
  • VS2017里面的类图:
  • 代码:
    public partial class Client
    {
        public string Code { get; set; }
        public string Name { get; set; }
        public ClientContactInfo ContactInfo { get; set; }
    }
    public partial class ClientContactInfo
    {
        public string CellPhoneNo { get; set; }
        public string TelePhoneNo { get; set; }
        public string Email { get; set; }
    }
  • DbContext:

    我是暂时不知道,在EFCore V2.2的版本里,怎么可以在DbContext里面指定一个Entity To俩table。如果你知道了,请告诉我哈
  • Add-Migration和Update-Database的结果
    运行Add-Migration和Update-Database命令之后,会有以下的结果,以及数据表结构:


    至于各个表的索引,以及外键的具体属性,建议大家可以下载代码来看看Solution里面的EFCoreDemoADB项目(SQL Server Database Project)。

通过上面的做法,一步步地,我们就通过Owned Entity Types实现了对需求的支持。
接下来,让我们一起来看看为什么Owned Entity Types会看起来是一个彩蛋。

彩蛋?####

有着上述的俩数据表,让我们从DB First的角度,继续用Microsoft.EntityFrameworkCore.Tools 这个CLI Tool,做一次逆向工程,看看它产生的代码是怎样的

  • 项目
  • 运行Scaffold-DbContext命令的结果
  • 得到的代码



怎样?逆向工程获得的代码,和原先的代码是不是有很大的不同(尤其是DbContext里面的代码)?
正如我之前的一系列博客里面说的,这里又存在着一个 逻辑设计 与 物理设计 的 β角。毕竟谁能想到,用的同样的EFCore,以及Microsoft.EntityFrameworkCore.Tools 这个CLI Tool,正向工程的结果,再进行反向工程之后,得到的代码会跟原来自己写的代码有着如此的不同之处?

如果我们一直都在用 DB First的做法,就目前V2.2版本的EFCore来说,还真没办法得到使用Owned Entity Types的代码

那么你有没有觉得,这个其实算是一个 彩蛋 呢?😛

好了,彩蛋 的说法,有点勉强,但总算能说的过去。那么 鸡肋 的说法,又从何说起呢?
有兴趣的话,请移步继续阅读下一篇鸡肋篇

posted on 2019-02-26 15:34  肥健  阅读(603)  评论(0编辑  收藏  举报

导航