继承关系

面向对象的三大特征之一:继承 ,在开发中起到了重要的作用。我们的实体本身也是类,继承自然是没有问题。下面开始分析 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的更多相关文章

  1. entityframework学习笔记--007-实体数据建模基础之继承关系映射TPT

    Table per Type Inheritance (TPT)建模 1.假设你有两张表与一张公共的表密切相关,如图7-1所示,Businiss表与eCommerce表.Retail表有1:0...1 ...

  2. 《Entity Framework 6 Recipes》中文翻译系列 (8) -----第二章 实体数据建模基础之继承关系映射TPT

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 2-8 Table per Type Inheritance 建模 问题 你有这样一 ...

  3. Code First 中的 TPH TPT TPC

    public class Blog { public int Id { get; set; } public DateTime Creationdate { get; set; } public st ...

  4. EF CodeFirst(四) 关系

    数据库表之间有一对一  一对多 多对多关系.那同样,CodeFirst也要能分析这些类之间的这些关系. CodeFirst可以自动通过分析类之间的属性导航属性 从而得出类之间的关系,自动确定外键. 一 ...

  5. 如何修改Entity Framework Db Frist模式下的Entity继承关系?

    1.准备工作 Db Frist创建实体数据模型(创建edmx并不是重点,各位随意即可),此处取名ZeroCodeDB,所得文件如图所示:其中红框中的文件(ZeroCodeDB.tt)是各实体的生成的关 ...

  6. EF里的继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子

    本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discr ...

  7. EF——继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子 05 (转)

    EF里的继承映射关系TPH.TPT和TPC的讲解以及一些具体的例子   本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF ...

  8. entity framework里的继承映射关系TPH、TPT和TPC

    本章节讲解EF里的继承映射关系,分为TPH.TPT.TPC.具体: 1.TPH:Table Per Hierarchy 这是EF的默认的继承映射关系:一张表存放基类和子类的所有列,自动生成的discr ...

  9. EF CodeFirst系列(3)---EF中的继承策略(暂存)

    我们初始化数据库一节已经知道:EF为每一个具体的类生成了数据库的表.现在有了一个问题:我们在设计领域类时经常用到继承,这能让我们的代码更简洁且容易管理,在面向对象中有“has  a”和“is a”关系 ...

随机推荐

  1. 利用mybatis-generator自动生成代码

    mybatis-generator有三种用法:命令行.eclipse插件.maven插件.个人觉得maven插件最方便,可以在eclipse/intellij idea等ide上可以通用. 下面是从官 ...

  2. springmvc集成shiro登录失败处理

    一般的登录流程会有:用户名不存在,密码错误,验证码错误等.. 在集成shiro后,应用程序的外部访问权限以及访问控制交给了shiro来管理. shiro提供了两个主要功能:认证(Authenticat ...

  3. Orchard创建全局应用

    Orchard的本地化管理托管于一个外部服务(Crowdin),这个项目是公开的且欢迎大家做贡献. Orchard支持两种类型的本地: Orchard应用程序以及已安装模块中的文本字符串的本地化(其实 ...

  4. [转] Asp.net vNext webapi 自托管

    [声明]本文转自:http://www.cnblogs.com/ListenCode/p/4206204.html 转载需注明! 微软推出的Asp.net vNext(asp.net 5.0)的其中的 ...

  5. php基础入门

    一.序言 由于新公司的需要,我也就从原来的asp专向了,php的学习中.希望通过自己的学习能够尽快的熟悉了解php 二.php独特的语法特色  1.引号问题 在php中单引号和双引号的作用基本相同,但 ...

  6. 年中review

    1. 做好已知的各种项目,争取能成立固定团队 (项目一期争取能在本月上线)2. 横向扩展技术学习,了解各种技术,加强技术素养(从Server到前端,现在要关注的知识点越来越多,fighting...) ...

  7. coursera 公开课 文本挖掘和分析(text mining and analytics) week 1 笔记

    一.课程简介: text mining and analytics 是一门在coursera上的公开课,由美国伊利诺伊大学香槟分校(UIUC)计算机系教授 chengxiang zhai 讲授,公开课 ...

  8. Linux服务器配置git服务

    前言 Git是一个非常著名的分布式版本控制系统,而广大开发者更是习惯在最大的远程仓库GitHub上提交自己的代码.但是有时候,一些小项目不值得放到GitHub上去,或是由于隐私问题不好在GitHub的 ...

  9. Java微信公众号开发-外网映射工具配置

    一.开发环境准备 1.一个微信公众号 2.外网映射工具(开发调试)如花生壳.ngrok工具 注:与微信对接的URL要具备以下条件a:在公网上能够访问 b:端口只支持80端口 这里使用ngrok.cc: ...

  10. tomcat 实例

    现在举一个tomcat应用的例子: 我们现在安装一个jenkins, jenkins的安装方式有两种: 一种是war包的安装方式 另一种是:把下载的安装war包放在tomcat的webapps目录下 ...