EF-CodeFirst 继承关系TPH、TPT、TPC
继承关系
面向对象的三大特征之一:继承 ,在开发中起到了重要的作用。我们的实体本身也是类,继承自然是没有问题。下面开始分析 EF里的继承映射关系TPH、TPT、TPC
现在我们有这样一个需求,用户里要有一批超级用户,他们有着与生具来的优越。可以体验到更高级的服务。但是超级用户也是用户,可以去继承我们的普通用户类 (其实个人感觉不是很合理,因为我们有UserRole表,给一个超级用户的角色就可以了。这里仅做演示)
/// <summary>
/// 超级用户
/// </summary>
public class SuperUser : User
{
/// <summary>
/// 超级用户卡号
/// </summary>
public string UserNum { get; set; }
}
TPH (Table Per Hierarchy)
TPH是EF中默认的继承映射关系, 我们现在直接Update-DataBase看一下表的结构是什么样的

可以看到,并没有生成另一张表,而是把SuperUser的属性加到了User表中,等待,貌似多出来一个Discriminator。其实他是用来标识记录是来自哪个实体的。下面做个测试,分别用User和SuperUser实体向表里插入一条数据
using (Entites aContext = new Entites())
{ Core.User.User user = new User()
{
Name = "小明",
UserAddress = new UserAddress() { City = "北京", DynamicAddress = "北京知春路" }
}; aContext.User.Add(user); Core.User.SuperUser superUser = new SuperUser()
{
Name = "超级小明",
UserNum = "12346789",
UserAddress = new UserAddress() { City = "北京", DynamicAddress = "北京798艺术区" }
};
aContext.User.Add(superUser); aContext.SaveChanges(); }
可以看到Discriminator分别标识了来自什么实体

其实我们也可以自己去配置,包含字段名和值都可以控制
public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{ Map<Core.User.SuperUser>(u => u.Requires("From").HasValue("From-Super"));
Map<Core.User.User>(u => u.Requires("From").HasValue("From-User")); }
}

TPT (Table per Type)
这个方式是值得推荐的,子类和父类在不同的表中。子类的表只拥有子类的属性。通过相同Id来关联User表
可以在类上直接 Table(“xxx”),也可以使用 Fluent Api。
public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
Map<Core.User.SuperUser>(u => u.ToTable("T_SuperUser"));
}
}
Update-DataBase一下,看看表结构

再插入数据看一下


TPC (Table Per Concrete Type)
这个。。。真的很不想说。存在即合理,还是简单说一下使用方式吧。。使用这种方式父类的属性在子类的表中也会存在。(恶心) 我就不生成了,,看着恶心。。。
public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
Map<Core.User.SuperUser>(u=>{
u => u.ToTable("T_SuperUser"));
u.MapInheritedProperties();
})
}
}
结束之语
之前使用复杂类型的时候,我就说过他的某些不好。因为代码上分开了,但是实际表中还是在一起的。TPT的方式很符合我的胃口。也是我一直在想要的扩展表的方式。当然都各有千秋,还是看实际项目的需求。存在即合理,说不定哪一天我也会用上恶心的TPC也说不定
EF-CodeFirst 继承关系TPH、TPT、TPC的更多相关文章
- entityframework学习笔记--007-实体数据建模基础之继承关系映射TPT
Table per Type Inheritance (TPT)建模 1.假设你有两张表与一张公共的表密切相关,如图7-1所示,Businiss表与eCommerce表.Retail表有1:0...1 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (8) -----第二章 实体数据建模基础之继承关系映射TPT
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-8 Table per Type Inheritance 建模 问题 你有这样一 ...
- Code First 中的 TPH TPT TPC
public class Blog { public int Id { get; set; } public DateTime Creationdate { get; set; } public st ...
- EF CodeFirst(四) 关系
数据库表之间有一对一 一对多 多对多关系.那同样,CodeFirst也要能分析这些类之间的这些关系. CodeFirst可以自动通过分析类之间的属性导航属性 从而得出类之间的关系,自动确定外键. 一 ...
- 如何修改Entity Framework Db Frist模式下的Entity继承关系?
1.准备工作 Db Frist创建实体数据模型(创建edmx并不是重点,各位随意即可),此处取名ZeroCodeDB,所得文件如图所示:其中红框中的文件(ZeroCodeDB.tt)是各实体的生成的关 ...
- EF里的继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子
本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discr ...
- EF——继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子 05 (转)
EF里的继承映射关系TPH.TPT和TPC的讲解以及一些具体的例子 本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF ...
- entity framework里的继承映射关系TPH、TPT和TPC
本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discr ...
- EF CodeFirst系列(3)---EF中的继承策略(暂存)
我们初始化数据库一节已经知道:EF为每一个具体的类生成了数据库的表.现在有了一个问题:我们在设计领域类时经常用到继承,这能让我们的代码更简洁且容易管理,在面向对象中有“has a”和“is a”关系 ...
随机推荐
- 对《重建中国.NET生态系统》评论贴的总结
Neuzilla官方微信公众号:搜 架构师联盟 或 neuzilla,也可以扫下面二维码 在看了<重建中国.NET生态系统>的各种哭爹喊娘骂街的评论之后,我觉得哦,淫才确实很多,但是么真正 ...
- ASP.NET 系列:单元测试
单元测试可以有效的可以在编码.设计.调试到重构等多方面显著提升我们的工作效率和质量.github上可供参考和学习的各种开源项目众多,NopCommerce.Orchard等以及微软的asp.net m ...
- js的几种排序
转载:http://www.jb51.net/article/81520.htm 一.冒泡排序 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
- node简单操作mysql的类
Creative.js 'use strict'; var pool = require('../utils/MysqlUtils'); var util = require('util'); var ...
- centos安装php扩展
我自己的方法 先卸载php 重新安装 再安装扩展 1 rpm -qa|grep php 查看php相关 2 rpm-e 名称 一个个删除,个别需要先删除其他组件才能删除, 3 再用 rpm -qa|g ...
- clean之后R文件消失
首先确定你的SDK是新的. 其次接下来检查你的.xml文件,文件名不能大写. 如果xml文件太多 ,那么clean一下你的项目,这时候注意看Console的提示. Console会提示你xml文件错误 ...
- github page 和 hexo 搭建在线博客
目录: 安装node.js与git 常用git命令 安装hexo 配置hexo hexo发布到github 1.安装node.js和git工具 https://nodejs.org/en/ 直接下载安 ...
- android -- 之PopupWindow的使用
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); View contentVi ...
- javascript 数组实例
在遍历数组时, 如果想要排除 null / undefined 和 不存在的元素时,代码如下: for ( var i = 0; i < a.length; i++ ){ //跳过null / ...
- ios审核要注意的地方(转)
磨刀不误砍柴工.作为手机应用开发者,你需要向应用商店提交应用审核,迅速通过审核可以让你抢占先机.对苹果iOS应用开发者来说尤其如此.苹果应用商店的审核近乎吹毛求疵,下面这些清单可以让你知道苹果会在哪些 ...