【Entity Framework】聊一聊EF中继承关系
【Entity Framework】聊一聊EF中继承关系
文章目录
- 【Entity Framework】聊一聊EF中继承关系
- 一、概述
- 二、实体类型层次结构映射
- 三、每个层次结构一张表和鉴别器配置
- 四、共享列
- 五、每个类型一张表配置
- 六、每个具体类型一张表配置
- 七、TPC数据库架构
- 八、总结
一、概述
Entity Framework
可以将.NET类型层次结构映射到数据库。这允许你像普通编程一样使用基类型和派生类型在代码中编写.NET实体,并让Entity Framework
无缝创建适应的数据库架构,发出查询等。有关如何映射类型层次结构的实际细节取决于提供程序;本博文将介绍关系数据库上下文中的继承支持。
二、实体类型层次结构映射
按照约定,Entity Framework
不会自动扫描基类型或派生类型;如果要映射层次结构中的CLR类型,就必须在模型上显式指定该类型。如,仅指定层次结构的基类型不会导致EF Core
隐式包含其所有子类型。
示例将为Blog
及其子类RssBlog
公开DbSet
。如果Blog
有任何其他子类,它不会包含在模型中。
internal class MyContext : DbContext
{public DbSet<Blog> Blogs { get; set; }public DbSet<RssBlog> RssBlogs { get; set; }
}public class Blog
{public int BlogId { get; set; }public string Url { get; set; }
}public class RssBlog : Blog
{public string RssUrl { get; set; }
}
使用TPH映射时,数据库会根据需要自动设置为可为null。如,
RssUrl
列可为null,因为常规Blog
实例没有该属性。
三、每个层次结构一张表和鉴别器配置
默认情况下,EF使用每个层次结构一张表(TPH)模式来映射继承。(TPH)使用单个表来存储层次结构中所有类型的数据,并使用鉴别器列来识别每行表示的类型。
上面的模型映射到以下数据库架构(注意隐式创建的Discriminiator
列,它标识了每行中存储的Blog
类型)。
BlogId | Url | RssUrl | |
---|---|---|---|
1 | Blog | https://blog.csdn.net/songjianlong | NULL |
2 | RssBlog | https://blog.csdn.net/songjianlong |
可以配置鉴别器列的名称和类型以及用于标识层次结构中每种类型的值:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().HasDiscriminator<string>("blog_type").HasValue<Blog>("blog_base").HasValue<RssBlog>("blog_rss");
}
在上面的示例中,EF在层次结构的基本实体上隐式添加了鉴别器作为影子属性。
protected overrid void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Property("Discriminator").HasMaxLength(200);
}
最后,鉴别器也可以映射到实体中的常规.NET属性:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().HasDiscriminator(b => b.BlogType);modelBuilder.Entity<Blog>().Property(e => e.BlogType).HasMaxLength(200).HasColumnName("blog_type");modelBuilder.Entity<RssBlog>();
}
查询使用 TPH 模式的派生实体时,EF Core 会在查询中添加一个基于鉴别器列的谓词。 此筛选器确保对于结果中没有的基类型或同级类型,我们不会获得任何附加行。 对于基本实体类型,将跳过此筛选器谓词,因为查询基本实体将获得层次结构中所有实体的结果。 在具体化查询结果时,如果遇到未映射到模型中任何实体类型的鉴别器值,我们将引发异常,因为我们不知道如何具体化结果。 仅当数据库包含的行具有鉴别器值并且这些值未映射到 EF 模型时,才会发生此错误。 如果你有这样的数据,可以将 EF Core 模型中的鉴别器映射标记为不完整,以指示我们应始终添加筛选器谓词来查询层次结构中的任意类型。 IsComplete(false)
在鉴别器配置上调用会将映射标记为不完整。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().HasDiscriminator().IsComplete(false);
}
四、共享列
默认情况下,当层次结构中的两个同级实体类型具有同名的属性时,它们将映射到两个单独的列。 但是,如果它们的类型相同,则可以映射到相同的数据库列:
public class MyContext : DbContext
{public DbSet<BlogBase> Blogs { get; set; }protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Blog>().Property(b => b.Url).HasColumnName("Url");modelBuilder.Entity<RssBlog>().Property(b => b.Url).HasColumnName("Url");}
}
public abstract class BlogBase
{public int BlogId { get; set; }
}
public class Blog : BlogBase
{public string Url { get; set; }
}
public class RssBlog : BlogBase
{public string Url { get; set; }
}
使用强制转换查询共享列时,关系数据库提供程序(例如 SQL Server)不会自动使用鉴别器谓词。 查询
Url = (blog as RssBlog).Url
还将返回同级Blog
行的Url
值。 若要将查询限制为RssBlog
实体,你需要在鉴别器上手动添加筛选器,例如Url = blog is RssBlog ? (blog as RssBlog).Url : null
。
五、每个类型一张表配置
在 TPT 映射模式中,所有类型都分别映射到各自的表。 仅属于某个基类型或派生类型的属性存储在映射到该类型的一个表中。 映射到派生类型的表还会存储外键来联接派生表与基表。
modelBuilder.Entity<Blog>().ToTable("Blogs");
modelBuilder.Entity<RssBlog>().ToTable("RssBlogs");
可以对每个根实体类型调用
modelBuilder.Entity<Blog>().UseTptMappingStrategy()
,而不是对每个实体类型调用ToTable,表名将由EF生成。
EF 将为上述模型创建以下数据库架构:
CREATE TABLE [Blogs] ([BlogId] int NOT NULL IDENTITY,[Url] nvarchar(max) NULL,CONSTRAINT [PK_Blogs] PRIMARY KEY ([BlogId])
);CREATE TABLE [RssBlogs] ([BlogId] int NOT NULL,[RssUrl] nvarchar(max) NULL,CONSTRAINT [PK_RssBlogs] PRIMARY KEY ([BlogId]),CONSTRAINT [FK_RssBlogs_Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blogs] ([BlogId]) ON DELETE NO ACTION);
如果重命名主键约束,新名词将应用于映射到层次结构的所有表。未来的EF版本将允许仅对特定表重命名约束。
六、每个具体类型一张表配置
在TPC映射模式中,所有类型都分别映射到各自的表。每张表都包含相应实体类型上所有属性的列。这解决了TPT策略的一些常见性能问题。
modelBuilder.Entity<Blog>().UseTpcMappingStrategy().ToTable("Blogs");
modelBuilder.Entity<RssBlog>().ToTable("RssBlogs");
无需对每个实体类型调用
ToTable
,只需对每个根实体类型调用modelBuilder.Entity<Blog>().UseTpcMappingStrategy()
即可按照约定生成表名。
七、TPC数据库架构
TPC
策略类类似与TPT
策略,除了为层次结构中每个具体类型创建不同的表,但表不是为抽象类型创建的,因此名称为“每个具体类型一张表”。与TPT
一样,表本身指示已保存对象的类型。但是,与TPT
映射不同,每个表都包含具体类型及其基类型中没个属性的列。TPC
数据库架构是非规范化的
八、总结
TPH 通常适用于大多数应用程序,并且对于各种方案而言都是一个很好的默认值,因此,如果不需要 TPC,请不要添加 TPC 来增加复杂性。 具体而言,如果代码主要查询许多类型的实体,例如针对基类型编写查询,则倾向于使用 TPH,而不是 TPC。
尽管如此,当代码主要查询单个叶类型的实体并且你基准测试显示与 TPH 相比有所改进时,TPC 也是一种很好的映射策略。
仅当受外部因素约束时,才使用 TPT。
相关文章:
【Entity Framework】聊一聊EF中继承关系
【Entity Framework】聊一聊EF中继承关系 文章目录 【Entity Framework】聊一聊EF中继承关系一、概述二、实体类型层次结构映射三、每个层次结构一张表和鉴别器配置四、共享列五、每个类型一张表配置六、每个具体类型一张表配置七、TPC数据库架构八、总结 一、概述 Entity Fra…...
curaengine编译源码之libarcus编译记录
libArcus的编译(成功安装) This library contains C code and Python3 bindings for creating a socket in a thread and using this socket to send and receive messages based on the Protocol Buffers library. It is designed to facilitate the c…...
运用OSI模型提升排错能力
1. OSI模型有什么实际的应用价值? 2. 二层和三层网络的区别和应用; 3. 如何通过OSI模型提升组网排错能力? -- OSI - 开放式系统互联 - 一个互联标准 - 从软件和硬件 定义标准 - 不同厂商的设备 研发的技术 - 具备兼容性 -- O…...
【Node.js】Express学习笔记(黑马)
目录 初识 ExpressExpress 简介Express 的基本使用托管静态资源nodemon Express 路由路由的概念路由的使用 Express 中间件中间件的概念Express 中间件的初体验中间件的分类 初识 Express Express 简介 什么是 Express? 官方给出的概念:Express 是基于…...
Linux系统部署Tale个人博客并发布到公网访问
目录 ⛳️推荐 前言 1. Tale网站搭建 1.1 检查本地环境 1.2 部署Tale个人博客系统 1.3 启动Tale服务 1.4 访问博客地址 2. Linux安装Cpolar内网穿透 3. 创建Tale博客公网地址 4. 使用公网地址访问Tale ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通…...
CentOS7里ifcfg-eth0文件不存在解决方案/Centos7修改网络IP解决方案
Centos7网络IP地址手动设置 1、centos7没有ifcfg-eth0,我的centos7也没有其他博客说的什么ifcfg-ens33、ifcfg-ens32,然后我打开了我这里的ifcfg-eno***,结果发现就是centos6里的ifcfg-eth0里的网络配置。2、vim ifcfg-eno***(按t…...
go第三方库go.uber.org介绍
Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter。其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 GitHub,经过一年的积累和更新,该规范已经初具规模…...
Oracle 正则表达式
一、Oracle 正则表达式相关函数 (1) regexp_like :同 like 功能相似(模糊 匹配) (2) regexp_instr :同 instr 功能相似(返回字符所在 下标) (3) regexp_substr : 同 substr 功能相似&…...
MongoDB聚合运算符:$rand
MongoDB聚合运算符:$rand 文章目录 MongoDB聚合运算符:$rand语法举例生成随机数据点从集合中随机选择条目 $rand聚合运算符用于返回一个0~1之间的随机浮点数。 语法 { $rand: {} }$rand运算符不需要任何参数。每次调用$rand都会返回一个小数点后最多17位…...
如何在Linux通过docker搭建Plik文件系统并实现无公网IP管理内网文件
文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问,实现随时随地在任意设备上传或者…...
k8s部署efk
环境简介: kubernetes: v1.22.2 helm: v3.12.0 elasticsearch: 8.8.0 chart包:19.10.0 fluentd: 1.16.2 chart包: 5.9.4 kibana: 8.2.2 chart包:10.1.9 整体架构图: 一、Elasticsearch安装…...
AI模型大PK
🤖AI模型大PK!免费测试GPT-4等36款顶级聊天机器人 近年来,大型语言模型(LLM)的发展日新月异,各大科技巨头和研究机构纷纷推出了自己的聊天机器人。那么,如何才能知道哪个模型更强大、更智能呢&…...
Matlab|基于广义Benders分解法的综合能源系统优化规划
目录 1 主要内容 广义benders分解法流程图: 优化目标: 约束条件: 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《综合能源系统协同运行策略与规划研究》第四章内容基于广义Benders分解法的综合能源系统优化规划&…...
vscode 打代码光标特效
vscode 打代码光标特效 在设置里面找到settings 进入之后在代码最下方加入此代码 "explorer.confirmDelete": false,"powermode.enabled": true, //启动"powermode.presets": "fireworks", // 火花效果// particles、 simple-rift、e…...
【代码随想录算法训练营第四十八天 | LeetCode198.打家劫舍、213.打家劫舍II、337.打家劫舍III】
代码随想录算法训练营第四十八天 | LeetCode198.打家劫舍、213.打家劫舍II、337.打家劫舍III 一、198.打家劫舍 解题代码C: class Solution { public:int rob(vector<int>& nums) {if (nums.size() 0) return 0;if (nums.size() 1) return nums[0];ve…...
蓝桥杯 — —灵能传输
灵能传输 友情链接:灵能传输 题目: 输入样例: 3 3 5 -2 3 4 0 0 0 0 3 1 2 3输出样例: 3 0 3思路: 题目大意:给出一个数组,每次选择数组中的一个数(要求不能是第一个数与最后一个…...
智慧安防系统EasyCVR视频汇聚平台接入大华设备无法语音对讲的原因排查与解决
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台支持7*24小时实时高清视频监控,能同时播放多路监控视频流,视频画面1、4、9、16个可选,支持自定义视频轮播。EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标…...
基于Pytorch框架的CNN-LSTM模型在CWRU轴承故障诊断的应用
目录 1. 简介 2. 方法 2.1数据集 2.2模型架构 1. 简介 CWRU轴承故障诊断是工业领域一个重要的问题,及早发现轴承故障可以有效地减少设备停机时间和维修成本,提高生产效率和设备可靠性。传统的基于信号处理和特征提取的方法通常需要手工设计特征&…...
QQ 邮箱使用 SMTP 发送邮件报错:550 The From header is missing or invalid
文章目录 场景描述问题排查根据提示查看原因查看封装的 message 个人简介 场景描述 QQ 邮箱使用 SMTP 发送邮件报错:550 The From header is missing or invalid: 失败原因:(550, bThe "From" header is missing or invalid. Ple…...
mysql中的视图
1、什么是视图? view:站在不同的角度去看待同一份数据。 2、怎么创建视图对象?怎么删除视图对象? 表复制: mysql> create table dept2 as select * from dept; 创建视图对象: create view dept2_v…...
树莓派点亮双色LED
双色LED灯准确来说叫双基色LED灯,是指模块只能显示2种颜色,一般是红色和绿色,可以有三种状态 :灭,颜色1亮,颜色2亮,根据颜色组合的不同,分为红蓝双色,黄蓝双色,红绿双色等等。 接线:将引脚S(绿色)和中间引脚(红色)连接到Raspberry Pi的GPIO接口上,对Raspberry…...
DAY27| 39. 组合总和 ,40.组合总和II ,131.分割回文串
文章目录 39.组合总和40.组合总和II131.分割回文串 39.组合总和 文字讲解:组合总和 视频讲解:组合总和 状态: 此题ok 思路: 代码: class Solution {int sum;public List<List<Integer>> combinationSum(int[] candi…...
24年重庆三支一扶报名照不通过怎么处理?
24年重庆三支一扶报名照不通过怎么处理?...
20240409在全志H3平台的Nano Pi NEO CORE开发板上运行Ubuntu Core16.04时跑通4G模块EC200A-CN【PPP模式】
20240409在全志H3平台的Nano Pi NEO CORE开发板上运行Ubuntu Core16.04时跑通4G模块EC200A-CN【PPP模式】 2024/4/9 14:25 【不建议使用ppp模式,功耗大,貌似更过分的!网速还低!】 【唯一的优点:ppp模式下是通过脚本配置…...
【示例】MySQL-不同case下索引的使用分析
前言 本文主要讲述不同SQL语句下,索引的生效情况。 关于索引的前置知识,本文不再讲述。 SQL语句性能分析方法 查看不同类型SQL语句的执行频率 SHOW GLOBAL STATUS LIKE COM_______;慢查询日志 该日志记录了SQL执行时间超过指定参数的所有SQL语句。…...
MySQL表空间管理与优化(8/16)
表空间管理和优化 innodb_file_per_table参数(此参数在分区表章节中还会出现): 这个参数决定了InnoDB表数据的存储方式。当参数设置为ON时,每个InnoDB表的数据会单独存储在一个以.ibd为后缀的文件中,这有利于管理和回收…...
杂货铺 | Linux虚拟机Ubuntu操作系统下设置共享文件夹(以及找不到hgfs文件夹怎么办)
文章目录 📚步骤一:配置共享文件夹📚步骤二:配置挂载环境📚步骤三:解决权限问题📚步骤四:解决重启失效问题 📚步骤一:配置共享文件夹 建立本地共享文件夹&…...
《HF经理》:二认知误区
一、管理者掌握重要权力: 二、全力来自管理者的职位: 三、管理者必须控制自己的直接下属: 对策:展示自己的品质,能力和影响力 四、管理者必须建立良好的个人关系: 五、管理这必须确保一切运行正常&…...
ELK日志分析系统之Zookeeper
一、Zookeeper简介 ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。分布式应用可以基于它实现更高级的服务,实现诸如同步服务、配置维护和集群管理或者命名的服务。 Zookeepe…...
家居网购项目(Ajax验证用户名+上传图片)
文章目录 1.Ajax验证用户名1.程序框架图2.修改MemberServlet3.修改login.jsp4.结果展示 2.Ajax判断验证码是否输入正确1.修改MemberServlet2.修改login.jsp3.结果展示 3.Ajax添加购物车1.程序框架图2.修改CartServlet2.修改index.jsp3.解决问题—未登录直接添加购物车ÿ…...
360全景图制作/河南靠谱seo地址
RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上。 在这篇文章中,你将会看到 RequestMapping 注解在被用来进行 Spring MVC 控制器方法的映射可以如何发挥其多才多艺的功能的。 Requ…...
做家纺的网站/2022年国际十大新闻
2019独角兽企业重金招聘Python工程师标准>>> 如果在移动端的话,由于移动端操作相对比较单一,因此loading形式也比较简单。通常做法是在请求发出时页面正中位置弹出一个loading的 toast,请求结束隐藏 toast 。 这种做法大家接受度比…...
网站快速搜索/网站搜索引擎优化主要方法
http://blog.csdn.net/yangyk125/article/details/29216149 多媒体编程——摄像头录像预览 1、 新建MFC工程,选择对话框工程。 2、新建一个static控件。 3、修改ID,并且在OnInitDialog里面获取指针。 4、加一个成员函数,并且在OnInitDialog…...
网站设计作业多少钱/进入百度搜索首页
课程介绍该课程以实战方式实现一套经典的分布式系统架构;讲解如何进行系统拆分架构:1、传统ssm框架搭建、2、独立restful服务工程搭建、3、服务接口底层访问、4、redis实现业务缓存、5、单点登录系统实现。 将传统的单系统工程,拆分成多个独立…...
吐鲁番seo快速排名/超级seo助手
更新 【2020.02.14】 增加了Android11的适配 增加了好友分享和隐私政策 界面更改为蓝色更清新 下载地址:http://www.soutcc.com/mockgps/ 感谢 @何生 更新 【2019.11.14】 增加了Android10的适配 修复了判断权限出错的bug 修改了启动后crash的b…...
张家港做网站的公司/如何制作自己的网页
oracle数据泵EXPDP和IMPDP使用说明 首先标题不知道是否正确,oracle数据泵好像包含了好多概念,目前只是零星接触了一下EXPDP和IMPDP工具。据百度而来的资料,oracle10g之后推出的这个工具在性能上要比此前的EXP和IMP要高,而且支持从…...