1. Table Per Hierarchy(TPH):只建立一个表,把基类和子类中的所有属性都映射为表中的列
2. Table Per Type(TPT):为基类和每个子类建立一个表,每个与子类对应的表中只包含子类特有的属性对应的列
3. Table Per Concrete(TPC):为每个子类建立一个表,每个与子类对应的表中包含基类的属性对应的列和子类特有属性对应的列

以上摘自:传送阵

TPH

举例如下:

1  public class Resort : Lodging
2     {
3         public string Entertainment { get; set; }
4
5         public string Activities { get; set; }
6
7     }

 1 namespace MSDNBlog
 2 {
 3     public class MyContext:DbContext
 4     {
 5         public MyContext()
 6             : base("DefaultConnection")
 7         {
 8
 9         }
10         public DbSet<Lodging> Lodgings { get; set; }
11
12         protected override void OnModelCreating(DbModelBuilder modelBuilder)
13         {
14             modelBuilder.Entity<Lodging>()
15                 .Map<Lodging>(l => l.Requires("From").HasValue("Loding"))
16                 .Map<Resort>(r => r.Requires("From").HasValue("resot"));
17             base.OnModelCreating(modelBuilder);
18         }
19
20     }
21
22     public class Lodging
23     {
24         public int LodgingId { get; set; }
25         public string Name { get; set; }
26         public string Owner { get; set; }
27     }
28
29     public class Resort : Lodging
30     {
31         public string Entertainment { get; set; }
32
33         public string Activities { get; set; }
34
35     }
36 }

View Code

生成的表结构如图:

其中 Discriminator的作用是鉴别数据是来自于基类还是子类,默认类型是nvarchar(128),对应的值为相应的类的名称

可以使用Fluent API的方式修改鉴别器的名称:

1   protected override void OnModelCreating(DbModelBuilder modelBuilder)
2         {
3             modelBuilder.Entity<Lodging>()
4                 .Map<Lodging>(l => l.Requires("From").HasValue("Loding"))
5                 .Map<Resort>(r => r.Requires("From").HasValue("resot"));
6             base.OnModelCreating(modelBuilder);
7         }

此时对应的表的结构如下图:

TPT

在TPT映射情形下,所有类型分别映射到不同的表,仅属于某个基类型或派生类型的属性存储在映射到该类型的一个表中。映射到派生类型的表还会存储一个将派生表与基表连接的外键。

1    //modelBuilder.Entity<Lodging>().ToTable("Lodings");
2             //modelBuilder.Entity<Resort>().ToTable("Restorts");
3             modelBuilder.Entity<Lodging>()
4                 .Map<Lodging>(l => l.ToTable("Lodings2"))
5                 .Map<Resort>(r=>r.ToTable("Resorts2"));
6                 

生成的表结构如下图:

当然也可以使用Data Annotation方式进行处理

  [Table("Lodging")]public class Lodging{public int LodgingId { get; set; }public string Name { get; set; }public string Owner { get; set; }      }[Table("Resort")]public class Resort : Lodging{public string Entertainment { get; set; }public string Activities { get; set; }}

View Code

TPC

为每个子类建立一个表,每个子类中包含基类的属性对应的列和子类特有的属性对应的列。TPC无法使用Data Annotation配置

1   //modelBuilder.Entity<Lodging>().ToTable("Lodgings");
2             //modelBuilder.Entity<Resort>().Map(r => { r.MapInheritedProperties(); r.ToTable("Resorts"); });
3             modelBuilder.Entity<Lodging>()
4                 .Map<Resort>(r => {
5                     r.ToTable("Resorts");
6                     r.MapInheritedProperties();
7                 });

生成的表结构如下图:

转载于:https://www.cnblogs.com/goodlucklzq/p/4600561.html

EF中的TPH、TPT、TPC相关推荐

  1. 关于EF中ApplyCurrentValues和ApplyOriginalValues区别

    关于EF中ApplyCurrentValues和ApplyOriginalValues区别:两者都是编辑数据时使用. //         // 摘要:         //     将 System ...

  2. 数据库在EF中创建模型

    数据库在EF中创建模型,最简单的理解就是把数据库的字段以及关系映射到项目中,在项目中通过EF框架和LINQ语句直接对数据库数据进行增删改查.下边手把手教你建立模型. 1.建立一个项目,添加新项目,选择 ...

  3. 在EF中使用SQL执行简单高效的增删查操作

    随着平台数据的积累,对于数据访问的速度要求愈来愈高.优化后台访问性能,将是之后的一个重点任务. 但是,后台在项目开发初期采用的是Abp(Lite DDD)框架,集成EnityFramework.因为之 ...

  4. EF中加载实体的方式

    EF中的查询执行时机: 1. foreach进行枚举 2. ToArray.ToList.ToDictionary 3. Linq的一些操作,如First.Any 4. DbSet上的Load操作.D ...

  5. EF中三大开发模式之DB First,Model First,Code First以及在Production Environment中的抉择

    一:ef中的三种开发方式 1. db first... db放在第一位,在我们开发之前必须要有完整的database,实际开发中用到最多的... <1> DBset集合的单复数... db ...

  6. CodeFirst EF中导航属性的个人理解

    >导航属性: 01.个人理解就是Ef中的属性在实体数据表中不存在(先这么认为); 02.就是除了根据表中列映射出的属性 之外根据表与表之间的关系的关联属性.方便操作与之关联的表; 例如: 有 表 ...

  7. EF中的那些批量操作

    在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率.那么这篇文章就来总结EF中的那些 ...

  8. [转载]EF中的那些批量操作

    阅读目录 插入 更新 删除 在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率.那么 ...

  9. EF框架学习(5)---EF中的在线和离线场景

    EF中的持久性场景 使用EF实现实体持久化(保存)到数据库有两种情况:在线场景和离线场景. 1.在线场景 在线场景中,context是同一个上下文实例(从DbContext派生),检索和保存实体都通过 ...

最新文章

  1. Modelsim下进行功能仿真没问题,可是在ISE综合报错,如何解决?
  2. Rxjava 实现接口回调的功能
  3. MySQL笔记3:深入理解MySQL中的NULL
  4. 好用的 Abyss Web Server
  5. 重温“ Java Sucks”
  6. 拼多多年货节上线,“百亿补贴”加码iPhone 12等产品
  7. Android 存储路径浅析
  8. 构建之法阅读笔记(二)
  9. Unique Email Addresses
  10. 3分钟tips:Python中的range与xrange
  11. 频率学派(Frequentists) 贝叶斯学派(Bayesians)
  12. 寻找最小的k个数(四种方法)
  13. Atitit 登录账号管理法passport 目录 1. 总则 1 1.1. 身份分类登录账号 管理员 操作人员 普通用户 1 1.2. 安全考虑,必须单独分开的账号储存表,使用不同等加密技术与秘
  14. 软考中级软件设计师笔记第二章计算机操作系统
  15. 数分下(第2讲):二阶线性微分方程的解法
  16. 只用js代码实现电子时钟,精确到毫秒
  17. 2019年9月总结,10月展望
  18. cv2.erode函数
  19. DASCTF部分复现
  20. TimingWheel 令人拍案叫绝的设计

热门文章

  1. 微信支付 生成付款二维码链接 并生成支付二维码图片 .net C#
  2. 关于java边框的知识
  3. Android SpannableString详细解析
  4. Mathematica 13.0.1 Linux版安装教程
  5. Lorry翻译(day 2)
  6. 采集程序 -【开源项目】
  7. Vue 零基础小白学习指南(附教程)
  8. 简单工厂模式--女娲造人造啥做啥
  9. 全球土地利用/覆盖数据
  10. linux安卓开发教程视频教程,陈超 FFMPEG跨平台iOSAndroidLinux高级开发实战视频教程...