前言:
继承影射其实也可以作为实体关系的一种,
但使用的地方明显比较少一些.
在Hibernate中,
继承映射主要有两种方式
1.单表继承映射
2.多表继承映射
当然比较好用的是单表继承映射,(只需要设置一个鉴别器属性即可),总体比较简单

EFCore的继承映射也分为这两种情况,分别是单表和多表
但不同的是
按照约定,EF 不会自动扫描基类型或派生类型;这意味着,如果要映射层次结构中的 CLR 类型,就必须在模型上显式指定该类型。 例如,仅指定层次结构的基类型不会导致 EF Core 隐式包含其所有子类型。(通俗一点说就是把所有的父类,子类都放到一个DbSet中放到DbContext里)

一.单表继承映射

以动物之间的关系为例

//基类
class Animal
{public int id { get; set; }public string name { get; set; }
}
//子类:鱼
class Fish:Animal
{public int flags;}//子类:狗class dog : Animal
{public int feet { get; set; }public string owner { get; set; }
}
//子类:熊
class Bear:Animal
{public string woodName { get; set; }public double wegiht { get; set; }
}

数据库上下文:

class ExtendDbContext:DbContext
{//将基类和子类都放在DbContext中public DbSet<Animal> animals { get; set; }public DbSet<dog> dogs { get; set; }public DbSet<Fish> fishes { get; set; }public DbSet<Bear> bears { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){var Connection = "server=XX;Database=XXX;uid=XXX;pwd=XXX";optionsBuilder.UseSqlServer(Connection);}}

输入

add-migration initialcreate -c ExtendDbContext
update-database -Context ExtendDbContext

成功的话进入迁移文件的建表代码

protected override void Up(MigrationBuilder migrationBuilder)
{migrationBuilder.CreateTable(name: "animals",columns: table => new{id = table.Column<int>(type: "int", nullable: false).Annotation("SqlServer:Identity", "1, 1"),name = table.Column<string>(type: "nvarchar(max)", nullable: true),//自动创建了鉴别器字段Discriminator = table.Column<string>(type: "nvarchar(max)", nullable: false),//下面都是子类的特有属性woodName = table.Column<string>(type: "nvarchar(max)", nullable: true),wegiht = table.Column<double>(type: "float", nullable: true),feet = table.Column<int>(type: "int", nullable: true),owner = table.Column<string>(type: "nvarchar(max)", nullable: true)},constraints: table =>{table.PrimaryKey("PK_animals", x => x.id);});
}

默认EFCore是单表继承映射,它会默认生成一个鉴别器字段在表中同时也是一个影子属性
表结构:

插入两条数据试试看

static void Main(string[] args)
{//繼承映射測試DemoExtendDbContext context = new ExtendDbContext();dog d1 = new dog();d1.name = "旺財";d1.owner = "jotaro";d1.feet = 4;Bear xionger = new Bear();xionger.name = "熊二";xionger.woodName = "西伯利亞";xionger.wegiht = 400.00;context.dogs.Add(d1);context.bears.Add(xionger);context.SaveChanges();}


(单表继承映射与普通映射的区别是单表继承映射把一张表映射并维护成多个对象)

(PS.鉴别器字段也可以在FluentAPI中指定,虽然没有必要)

protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Blog>().Property("Discriminator").HasMaxLength(200);
}

二.多表继承映射

//多表继承的基类
class Computer
{public String id { get; set; }public String CPU { get; set; }public int RAM { get; set; }
}
//多表继承的子类
class laptop:Computer
{public String LAPTOP_Screen { get; set; }public String ModeID { get; set; }
}
class PC:Computer
{public String PC_Screen { get; set; }public String PC_box { get; set; }
}

数据库上下文:

class ExtendDbContextSec : DbContext
{public DbSet<Computer> computers { get; set; }public DbSet<PC> PCs { get; set; }public DbSet<laptop> laptops { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){var Connection = "server=XX;Database=XXX;uid=XX;pwd=XXXX";optionsBuilder.UseSqlServer(Connection);}//多表繼承映射只需要在FluentAPI里为每一种实体指定一张数据表即可protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Computer>().ToTable("t_computer");modelBuilder.Entity<laptop>().ToTable("t_laptop");modelBuilder.Entity<PC>().ToTable("t_pcs");}
}

同样查看一下建表语句:

protected override void Up(MigrationBuilder migrationBuilder)
{//创建基类表migrationBuilder.CreateTable(name: "t_computer",columns: table => new{id = table.Column<string>(type: "nvarchar(450)", nullable: false),CPU = table.Column<string>(type: "nvarchar(max)", nullable: true),RAM = table.Column<int>(type: "int", nullable: false)},constraints: table =>{table.PrimaryKey("PK_t_computer", x => x.id);});//创建子类表migrationBuilder.CreateTable(name: "t_laptop",columns: table => new{id = table.Column<string>(type: "nvarchar(450)", nullable: false),LAPTOP_Screen = table.Column<string>(type: "nvarchar(max)", nullable: true),ModeID = table.Column<string>(type: "nvarchar(max)", nullable: true)},//自动添加主键,同时也作为外键参考t_computer的主键constraints: table =>{table.PrimaryKey("PK_t_laptop", x => x.id);table.ForeignKey(name: "FK_t_laptop_t_computer_id",column: x => x.id,principalTable: "t_computer",principalColumn: "id",onDelete: ReferentialAction.Restrict);});//创建子类表migrationBuilder.CreateTable(name: "t_pcs",columns: table => new{id = table.Column<string>(type: "nvarchar(450)", nullable: false),PC_Screen = table.Column<string>(type: "nvarchar(max)", nullable: true),PC_box = table.Column<string>(type: "nvarchar(max)", nullable: true)},//自动添加主键,同时也作为外键参考t_computer的主键constraints: table =>{table.PrimaryKey("PK_t_pcs", x => x.id);table.ForeignKey(name: "FK_t_pcs_t_computer_id",column: x => x.id,principalTable: "t_computer",principalColumn: "id",onDelete: ReferentialAction.Restrict);});}

数据库表结构:

测试:

static void Main(string[] args){ExtendDbContextSec contextSec = new ExtendDbContextSec();laptop rog = new laptop();rog.CPU = "i7-11800h";rog.RAM = 32;rog.LAPTOP_Screen = "300hz";rog.ModeID = "XHX";PC taishi = new PC();taishi.CPU = "i9-12900k";taishi.RAM = 16;taishi.PC_box = "alien";taishi.PC_Screen = "AOC XXXXX";contextSec.PCs.Add(taishi);contextSec.laptops.Add(rog);contextSec.SaveChanges();}

EntityFrameWork Core从零开始,(九)继承影射的补充相关推荐

  1. ASP.NET Core Identity自定义数据库结构和完全使用Dapper而非EntityFramework Core

    前言 原本本节内容是不存在的,出于有几个人问到了我:我想使用ASP.NET Core Identity,但是我又不想使用默认生成的数据库表,想自定义一套,我想要使用ASP.NE Core Identi ...

  2. EntityFramework Core 3.x添加查询提示(NOLOCK)

    前几天看到有博客园中有园友写了一篇关于添加NOLOCK查询提示的博文,这里呢,我将介绍另外一种添加查询提示的方法,此方式源于我看过源码后的实现,孰好孰歹,请自行判之,接下来我们一起来看看. 在Enti ...

  3. EntityFramework Core表名原理解析,让我来,揭开你神秘的面纱

    上一节我们针对最开始抛出的异常只是进行了浅尝辄止的解析,是不是有点意犹未尽的感觉,是的,我也有这种感觉,看到这里相信您和我会有一些疑惑,要是我们接下来通过注解.Fluent APi.DbSet分别对表 ...

  4. EntityFramework Core动态加载模型,我们要知道些什么呢?

    这篇文章源于一位问我的童鞋:在EntityFramework Core中如何动态加载模型呢?在学习EntityFramwork时关于这个问题已有对应童鞋给出答案,故没有过多研究,虽然最后解决了这位童鞋 ...

  5. EntityFramework Core解决并发详解

    前言 对过年已经无感,不过还是有很多闲暇时间来学学东西和多陪陪爸妈,这一点是极好的,好了,本节我们来讲讲EntityFramework Core中的并发问题. 话题(EntityFramework C ...

  6. EntityFramework 6.x和EntityFramework Core必须需要MultipleActiveResultSets?

    前言 本节我们来探讨到底需不需要在连接字符串上加上MultipleActiveResultSets = true ?,若您有更深层次的理解欢迎留下您的脚印. EntityFramework 6.x和E ...

  7. EntityFramework Core 1.1有哪些新特性呢?我们需要知道

    前言 在项目中用到EntityFramework Core都是现学现用,及时发现问题及时测试,私下利用休闲时间也会去学习其他未曾遇到过或者用过的特性,本节我们来讲讲在EntityFramework C ...

  8. EntityFramework Core查询数据基本本质

    [导读]在EntityFramework Core中.当查询出数据后,是如何将数据映射给实体的呢?本节我们预先做个基本探讨,后续给出其底层原理本质 前不久,我们在探索性能时,给出利用反射达到性能瓶颈时 ...

  9. EntityFramework Core如何映射动态模型?

    [导读]本文我们来探讨下映射动态模型的几种方式,相信一部分童鞋项目有这样的需求,比如每天/每小时等生成一张表,此种动态模型映射非常常见,经我摸索,这里给出每一步详细思路,希望能帮助到没有任何头绪的童鞋 ...

最新文章

  1. 配置腾讯云服务器-2021-3-27
  2. TCP和UDP基本原理
  3. 专家支招:手把手教你如何选型移动CRM
  4. 怎样从0开始搭建一个测试框架_0
  5. 此安装程序必须使用 java 开发工具包 (jdk) 执行_彻底搞懂Java开发工具包(JDK)安装及环境变量配置...
  6. spring整合activeMQ遇到异常:Error creating bean with name 'connectionFactory'
  7. c#简单记事本应用程序的快捷方式_Windows 10七月更新又翻车,记事本没了
  8. 展示面-网络安全相关学习总结
  9. 【python基础知识】AttributeError: module 'turtle' has no attribute 'setup'
  10. 利用layui来完成垂直和侧边导航的小案例
  11. 再来一个end——好像很有用
  12. Screen Space Reflection 2
  13. java配置自动任务,定期执行代码
  14. 计算机总提示优盘格式化,金士顿u盘一插进电脑就提示格式化怎么办?不想格式化又怎么办?...
  15. echarts实现省份迁徙图
  16. 一打卡作弊软件CEO被判5年6个月,网友:这也太...
  17. 2014版C 语言程序设计基础,清华大学出版社-图书详情-《C/C++程序设计基础与实践教程》...
  18. python画板——小猪佩奇
  19. Python|用turtle画笔画爱心
  20. 在HTML中实现两个div并排显示

热门文章

  1. java csv 复杂表头_java读csv 和excel
  2. LeetCode38——Count and Say
  3. 从0配置halo博客并配置SSL
  4. 泡泡博客社区源码,简洁,轻便php源码
  5. OpenSea钓鱼攻击事件得到的启发警惕
  6. formdata格式的数据如何处理?
  7. 纳德拉干得不错!微软股价逼近14年最高点
  8. 鸿蒙音波萨顶顶,萨顶顶卸妆堪比整容,“神婆”变女神,网友:早就该这样!...
  9. 东北大学校园网一键登录安卓实现
  10. 读《测试构架师修炼之道》-Chapter4 测试构架师的知识能力模型