Entity Framework 继承映射
时间:2022-07-24
本文章向大家介绍Entity Framework 继承映射,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
继承是面向对象开发时经常用到的,但是SQL Server 数据库不具备继承,那么怎么办能?我们可以利用如下三种方法:
- TPH(Table per Hierachy):对SQL架构进行非规范化来表示多态,使用鉴别列对类型区分;
- TPT(Table per Type):用外键表示继承关系
- TPC(Table per Concete class):完全丢弃多态和继承
零、TPH
TPH是将整个类层次映射到但表中,该表包含所有类中的所有属性,特定行表示的具体子类通过 discriminator 来标识区分。TPH是Code First 默认人的继承策略,没有表示C#的多态特性,优点是不需要联合查询,是最简单的策略。缺点是除主键和标识列 discriminator 外,其他的列都是可为空。父类中的某些属性对于子类来说并不是必需的,因此Code First 会将改属性创建为可空列。TPH策略因为有 discriminator 列的存在,维护性不强,因此违反了第三范式。
一、TPT
TPT是常用的策略,通过外键来表示继承,父类和子类分别位于不同的表中,子类表包含自身属性列和父类表的外键,并将父表的外键作为子类表的主键。定义TPT继承策略需要在上下文中进行如下配置:
modelBuilder.Entity<Person>().ToTable("Person");
modelBuilder.Entity<Woman>().ToTable("Woman");
TPT的有点是将模型进行了扁平化,对父类的修改或对子类的添加都只是操作各自的表。与父类的多态关联将被表示为引用父类表的外键。缺点在于性能极差,如果要进行查询就要多表连接查询。
二、 TPC
TPC是不被推荐的策略,因为他会为每个子类创建一个表,并且将父类中的所有属性映射进每个子类表中。创建TPC映射,需要在上下文中进行如下定义:
modelBuilder.Entity<Person>().Map(p=>{
p.MapInheritedProperties();
p.ToTable("Person");
});
modelBuilder.Entity<Woman>().Map(p=>{
p.MapInheritedProperties();
p.ToTable("Woman");
});
注:参与TPC继承层次结构的表不共享主键,因此插入到子类表中的数据会存在重复的主键。要解决这个问题需要为每个表指定不同的标识,也可以关闭主键属性的标识。
下面总结一下以上三种策略的使用场景
策略 |
场景 |
---|---|
TPC |
不需要多表关联查询或者很少查询父类数据,并且没有与父类关联的类 |
TPH |
需要多表关联查询,且子类的属性较少 |
TPT |
需要多表关联查询,且子类的属性很多 |
- Global eval. What are the options?
- 3d效果的图片轮播
- 关于等待事件"read by other session"(r3笔记第89天)
- URI编码解码和base64
- 阿里大数据竞赛第一名大神github源代码分享(O2O优惠券使用预测)
- 关于导入dump(r3笔记第98天)
- DOM 节点的克隆与删除
- 异步Promise实现
- 《数学之美》拾遗——TF-IDF
- javascript URL实现简易书签
- 爬取淘宝/天猫评论数据的过程
- 通过shell分析表依赖的层级关系(r3笔记第97天)
- 简单易学的机器学习算法——决策树之ID3算法
- 一个框架解决几乎所有机器学习问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法