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

以上摘自:传送阵

TPH

举例如下:

  public class Resort : Lodging
{
public string Entertainment { get; set; } public string Activities { get; set; } }
 namespace MSDNBlog
{
public class MyContext:DbContext
{
public MyContext()
: base("DefaultConnection")
{ }
public DbSet<Lodging> Lodgings { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Lodging>()
.Map<Lodging>(l => l.Requires("From").HasValue("Loding"))
.Map<Resort>(r => r.Requires("From").HasValue("resot"));
base.OnModelCreating(modelBuilder);
} } public class Lodging
{
public int LodgingId { get; set; }
public string Name { get; set; }
public string Owner { get; set; }
} public class Resort : Lodging
{
public string Entertainment { get; set; } public string Activities { get; set; } }
}

生成的表结构如图:

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

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

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

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

TPT

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

    //modelBuilder.Entity<Lodging>().ToTable("Lodings");
//modelBuilder.Entity<Resort>().ToTable("Restorts");
modelBuilder.Entity<Lodging>()
.Map<Lodging>(l => l.ToTable("Lodings2"))
.Map<Resort>(r=>r.ToTable("Resorts2"));

生成的表结构如下图:

当然也可以使用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; } }

TPC

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

   //modelBuilder.Entity<Lodging>().ToTable("Lodgings");
//modelBuilder.Entity<Resort>().Map(r => { r.MapInheritedProperties(); r.ToTable("Resorts"); });
modelBuilder.Entity<Lodging>()
.Map<Resort>(r => {
r.ToTable("Resorts");
r.MapInheritedProperties();
});

生成的表结构如下图:

EF中的TPH、TPT、TPC的更多相关文章

  1. Code First 中的 TPH TPT TPC

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

  2. EF中逆变和协变

    EF中的增删改查: 实现步骤: 1.声明一个EF的上下文. bjhksjEntities dbContext = new bjhksjEntities(); 2.声明一个实体. HKSJ_USERS ...

  3. 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...

  4. 2.EF中 Code-First 方式的数据库迁移

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...

  5. EF中扩展出Between操作符 (修订版)

    随手记录一下,这是针对原文错误的修改. 原文:EF中扩展出Between操作符 直接使用是错误的,修改后的扩展方法: /// <summary> /// 扩展 Between 操作符 // ...

  6. 如何在EF中实现left join(左联接)查询

    在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时 ...

  7. EF中执行sql语句,以及事务

    EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...

  8. EF架构~在ef中支持IQueryable级别的Contains被翻译成了Exists,性能可以接受!

    回到目录 Entityframeworks很聪明 不错,非常不错!ef里的contains比linq to sql里的contains有了明显的提升,事实上,是在进行SQL语句翻译上有所提升,在lin ...

  9. DB表的关系及EF中Fluent API的使用

    现在使用多数的数据库是关系型数据库,那么表与表之间的关系就会显得尤其重要,对于数据的CRUD处理和以后数据的分析有很大的好处.下面是对于数据库中对表关系的理解以及在EF中使用Fluent API来创建 ...

随机推荐

  1. 腾讯云(centos)上安装apache

    安装 yun install httpd 随系统自启动 chkconfig httpd on 修改/etc/httpd/conf/httpd.conf文件 #修改WWW目录为自己的目录 Dcoumen ...

  2. 关于.net根目录路径的问题

    今天做了一个项目,用了url重写,但是在本地目录是localhost/BK/index.aspx,而其他目录也必须带bk,不带的话就找不到页面,(iis里正常) 应该主目录去掉bk,设置方法,右击网站 ...

  3. uva 10922 - 2 the 9s

    題目意思:讀取一數字,此數字最大有1000位.計算該數字是否為九的倍數?如是,再計算其階層數. ※判斷是否為九的倍數:所有位數相加 ÷ 9=0,即為九的倍數. ※計算階層數:所有位數相加後得出的第一個 ...

  4. runtime error ?

    程序运行时错误(运行时出错就是出现在程序运行过程中的),有很多种: 比如:溢出.内存泄露.死循.乱用指针.数组越界(数组开小了?).除以0错误.递归太深层(系统暴栈了)

  5. php开发客服系统(持久连接+轮询+反向ajax)

    欢迎在php严程序 - php教程学习AJAX教程, 本节课讲解:php开发客服系统(持久连接+轮询+反向ajax) php开发客服系统(下载源码) 用户端(可直接给客户发送消息)客服端(点击用户名. ...

  6. Java学习笔记--HashMap中使用object做key的问题【转】

    在HashMap中,如果需要使用多个属性组合作为key,可以将这几个属性组合成一个对象作为key.但是存在的问题是,要做get时,往往没办法保存当初put操作时的key object的referenc ...

  7. 工程和界面—Webstorm入门指南 Webstorm中的工程-备

    1.新建工程 “Quick Start”界面新建工程: 也可以点击顶部菜单栏“File”-> “New Project”. 弹出如下界面: “Location”指向想要创建的工程目录(如果该目录 ...

  8. 原型模式 - OK

    原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 简单说来原型模式就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节. 原型模式UML ...

  9. 玩Linux桌面发现一个最佳的组合配置

    其实前段时间玩Arch,其实不难,主要是太浪费时间配置折腾了,学到有用的东西太少,不能让我快速进入编程工作的状态,(真不知道有些人用Gentoo和Arch都能用出优越感了,就因为难安装和配置??)但是 ...

  10. Oracle 11gR2 RAC Votedisk and OCR Diskgroup Recovery

    check votedisk and OCR [root@vzwc1 ~]# ocrcheck Status of Oracle Cluster Registry is as follows : Ve ...