当前位置: 首页 > news >正文

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看一下表的结构是什么样的

 

image

可以看到,并没有生成另一张表,而是把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分别标识了来自什么实体

image

 

其实我们也可以自己去配置,包含字段名和值都可以控制

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"));

        }
    }

image

 

 

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一下,看看表结构

 

image

再插入数据看一下

image

image

 

 

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也说不定

转载于:https://www.cnblogs.com/LiangSW/p/5816181.html

相关文章:

  • 洛谷 P1313 计算系数 Label:杨辉三角形 多项式计算
  • Oracle存储过程基本语法介绍
  • Centos 配置 puppet 服务
  • bash中获取其他时间的日期
  • 【MySQL】5.7新特性之六
  • 基于jQuery免费开源图片裁切插件 - Croppic
  • 自定义编译安装python简单笔记。
  • 云支付整合Tp3.2.3代码整理
  • mysql select 结果集循环
  • EF实体框架之CodeFirst八
  • checkbox功能实现之全选、反选、取消
  • mybatis generator Date类型时间丢失
  • 预防AD对象意外删除--启用ADRecycleBin
  • ftl 列表弄成js数组
  • Spring配置hibernate读取实体类映射mappingResources,annotatedClasses,packagesToScan
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 《剑指offer》分解让复杂问题更简单
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • download使用浅析
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • leetcode386. Lexicographical Numbers
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • node.js
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spring Cloud Feign的两种使用姿势
  • SSH 免密登录
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 浅谈Golang中select的用法
  • 如何用vue打造一个移动端音乐播放器
  • 树莓派 - 使用须知
  • 一天一个设计模式之JS实现——适配器模式
  • 源码安装memcached和php memcache扩展
  • linux 淘宝开源监控工具tsar
  • ​​​​​​​​​​​​​​Γ函数
  • ​configparser --- 配置文件解析器​
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (2)Java 简介
  • (39)STM32——FLASH闪存
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (MATLAB)第五章-矩阵运算
  • (pojstep1.1.2)2654(直叙式模拟)
  • (五)IO流之ByteArrayInput/OutputStream
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)scrum常见工具列表
  • ./configure,make,make install的作用
  • .Family_物联网
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET 发展历程
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?