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 ...
随机推荐
- appium-android 遇到swipe函数无法使用的问题及解决办法
问题:cannot resolve method swipe() 问题出现原因:File->Project Structure->Modules->Dependencies-> ...
- 【做题】ECFinal2018 J - Philosophical … Balance——dp
原文链接 https://www.cnblogs.com/cly-none/p/ECFINAL2018J.html 题意:给出一个长度为\(n\)的字符串\(s\),要求给\(s\)的每个后缀\(s[ ...
- 配置IPMI
服务器电源管理 查看服务器电源状态 ipmitool chassis power status 关闭服务器电源 ipmitool chassis power off 打开服务器电源 ipmitool ...
- Java发送邮件 —— SpringBoot集成Java Mail
用途:此文仅供,自己今后的小程序通过邮件,批量通知用户. 简单记录了一些发送基本邮件的操作. 项目(SpringBoot版本为2.1.2.RELEASE): 核心依赖(其他相关依赖,在其使用的地方具体 ...
- java中==和equals的区别(转)
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(== ...
- hdu 4856 Tunnels 状态压缩dp
Tunnels Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem ...
- [Database]Oracle数据库中concat和||的区别
注:在oracle中,需要上述多次拼接应使用||,因为concat()一次只能拼接2个,需要多次嵌套.而在mysql中,可以实现concat(col1,col2,coln....) 官方文档链接:CO ...
- spring 事务关键类
TransactionInterceptor-> TransactionAspectSupport spring 事务的提交 AbstractPlatformTransactionManager
- ElasticSearch改造研报查询实践
背景: 1,系统简介:通过人工解读研报然后获取并录入研报分类及摘要等信息,系统通过摘要等信息来获得该研报的URI 2,现有实现:老系统使用MSSQL存储摘要等信息,并将不同的关键字分解为不同字段来提供 ...
- 【洛谷p1162】填涂颜色
(今天yy出奇的不活泼,认真的吓人) [传送门] 算法标签: 思路啊qwq: part1: 想法是先暴搜出每一行的1,取最前方一个1和最后方一个1,然后中间的0填上色,80分,因为没有考虑到“0001 ...