前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Entity Framework 继承映射

Entity Framework 继承映射

作者头像
喵叔
发布2020-09-08 16:21:51
7510
发布2020-09-08 16:21:51
举报
文章被收录于专栏:喵叔's 专栏喵叔's 专栏

继承是面向对象开发时经常用到的,但是SQL Server 数据库不具备继承,那么怎么办能?我们可以利用如下三种方法:

  1. TPH(Table per Hierachy):对SQL架构进行非规范化来表示多态,使用鉴别列对类型区分;
  2. TPT(Table per Type):用外键表示继承关系
  3. TPC(Table per Concete class):完全丢弃多态和继承
零、TPH

TPH是将整个类层次映射到但表中,该表包含所有类中的所有属性,特定行表示的具体子类通过 discriminator 来标识区分。TPH是Code First 默认人的继承策略,没有表示C#的多态特性,优点是不需要联合查询,是最简单的策略。缺点是除主键和标识列 discriminator 外,其他的列都是可为空。父类中的某些属性对于子类来说并不是必需的,因此Code First 会将改属性创建为可空列。TPH策略因为有 discriminator 列的存在,维护性不强,因此违反了第三范式。

一、TPT

TPT是常用的策略,通过外键来表示继承,父类和子类分别位于不同的表中,子类表包含自身属性列和父类表的外键,并将父表的外键作为子类表的主键。定义TPT继承策略需要在上下文中进行如下配置:

代码语言:javascript
复制
modelBuilder.Entity<Person>().ToTable("Person");
modelBuilder.Entity<Woman>().ToTable("Woman");

TPT的有点是将模型进行了扁平化,对父类的修改或对子类的添加都只是操作各自的表。与父类的多态关联将被表示为引用父类表的外键。缺点在于性能极差,如果要进行查询就要多表连接查询。

二、 TPC

TPC是不被推荐的策略,因为他会为每个子类创建一个表,并且将父类中的所有属性映射进每个子类表中。创建TPC映射,需要在上下文中进行如下定义:

代码语言:javascript
复制
modelBuilder.Entity<Person>().Map(p=>{
  p.MapInheritedProperties();
  p.ToTable("Person");
});
modelBuilder.Entity<Woman>().Map(p=>{
  p.MapInheritedProperties();
  p.ToTable("Woman");
});

注:参与TPC继承层次结构的表不共享主键,因此插入到子类表中的数据会存在重复的主键。要解决这个问题需要为每个表指定不同的标识,也可以关闭主键属性的标识。

下面总结一下以上三种策略的使用场景

策略

场景

TPC

不需要多表关联查询或者很少查询父类数据,并且没有与父类关联的类

TPH

需要多表关联查询,且子类的属性较少

TPT

需要多表关联查询,且子类的属性很多

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零、TPH
  • 一、TPT
  • 二、 TPC
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档