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的代码。
那么你有没有觉得,这个其实算是一个 彩蛋 呢?
EFCore Owned Entity Types,彩蛋乎?鸡肋乎?之彩蛋篇的更多相关文章
- EFCore Owned Entity Types,彩蛋乎?鸡肋乎?之鸡肋篇
鸡肋 鸡肋(Chicken ribs),现代汉语词语,出自<三国志·魏书·武帝纪>裴松之注引<九州春秋>曰:"夫鸡肋,弃之如可惜,食之无所得,以比汉中,知王欲还也.& ...
- EF Core 新特性——Owned Entity Types
Owned Entity Types 首先owned entity type是EF Core 2.0的新特性. 至于什么是owned entity types,可以先把他理解为EF Core官方支持的 ...
- EF中的实体类型【Types of Entity in Entity】(EF基础系列篇8)
We created EDM for existing database in the previous section. As you have learned in the previous se ...
- 淘宝首页源码藏美女彩蛋(下)(UED新作2013egg)
我们已经知道,执行美女会得到"彩蛋",而正是彩蛋做到了taobaoUED展现给大家的神奇的前端魅力.今天我们来看看FP.egg&&FP.egg("%cjo ...
- Types of Entity in Entity Framework:
http://www.entityframeworktutorial.net/Types-of-Entities.aspx We created EDM for existing database i ...
- 彩蛋 Python之道
彩蛋 Python之道 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 使用下面的语句可以调出Python中的一个彩蛋, impo ...
- 如何用EFCore Lazy Loading实现Entity Split
α角 与 β角 支持 现实生活 的 计算机系统,总有着两大偏差,第一个是 现实生活 与 计算机系统 的α角,另外一个是计算机系统的 逻辑设计 与 物理设计 的β角.举个栗子: α角:假设某个公司的商业 ...
- [转]Entity Framework Fluent API - Configuring and Mapping Properties and Types
本文转自:https://msdn.microsoft.com/en-us/data/jj591617#1.2 When working with Entity Framework Code Firs ...
- Entity Framework Tutorial Basics(8):Types of Entity in Entity Framework
Types of Entity in Entity Framework: We created EDM for existing database in the previous section. A ...
随机推荐
- Eclipse/MyEclipse导入导出注释模板
1.Eclipse/MyEclipse导入注释模板 (1)打开Eclipse/MyEclipse工具,打开或创建一个Java工程,点击菜单Window->Preferences弹出首选项设置窗口 ...
- [系统相关]WPS Office 2016 专业增强版 10.8.0.6470 免序列号无限制
WPS Office (10.8.0.6470) 新增功能列表 ============================================= 改进功能列表 ------------ W ...
- 从手机中导出apk
输入指令adb devices, 出现类似下面信息,说明设备连接成功. List of devices attached HT4C3JT00386 device 3.查看该手机所有安装包的包名, 输入 ...
- combineReducers
const reactInit = '@@react/Init' const combineReducers = (reducers) => { const finalReducers = {} ...
- Nodejs运行错误小结
(迁移自旧博客2017 04 15) 在使用过程中会遇到一些问题,学习过程中不定期更新. 问题一 错误如下 **events.js:72 throw er; // Unhandled 'error' ...
- 关于查询ios的app更新的历史版本记录
https://www.qimai.cn 推荐七麦数据 可以查询app的各种版本更新内容 由于历史久远忘记了自己app第一次上架的时间 通过这个可以查询
- hbase调优配置项笔记
gc配置 hbase-env.sh export HBASE_OPTS="$HBASE_OPTS -XX:+UseConcMarkSweepGC" export HBASE_OPT ...
- (一)为什么要UML
1 建模的意义 模型是对于现实的简化,建模是为了更好的理解系统 模型帮助我们按照实际情况或需求对系统可视化 模型允许我们详细说明系统的构造,行为 模型给出一个构造系统的模板 模型对我们做出的决策进行文 ...
- vue 双向绑定 数据修改但页面没刷新
在数据改动的代码后加 this.$forceUpdate(); 若是在某个特定方法中 则将this改为方法中设定的名称
- mysql将查询结果导出
一.首先确认当前数据库设置导出是允许的 show variables like '%secure%'; 如果是null则代表不允许,这时可以用命令修改,或者直接修改数据库配置文件my.ini,在其中添 ...