继承关系映射到数据库表中有多种方式:

第一种:TPH(table-per-hiaerachy) 每一层次一张表 (只有一张表)

仅使用名为父类的类型名的一张表,它包含了各个子类的所有属性信息,使用区分列(Disciriminator column)(通常内容为子类的类型名)来区分哪一行表示什么类型的数据。

第二种:TPT(Table-per-type) 每种类型都有一张表(父类及每个子类都有表)

父类、各子类各自都有一张表。父类的表中只有共同的数据,子类表中有子类特定的属性。TPT很像类的继承结构。父表格与子表格间通过外键关联。

第三种:TPC(table-per-Concrete Class)具体子类一张表(子类有表)

映射非抽象类到各自的表。每个具体类的属性,包括共有的继承属性,都会映射到各自的数据库表中。它的数据库的结构与没有实现继承关系的一样。

TPC、TPH继承模式一般有更好的性能,因为TPT会导致复杂的连接查询。

这三种EF数据库映射模式都可以使用Fluent API来实现,通过覆写DbContext 类的中OnModelCreatin方法。

一、TPH的实现。

在Entity Framework 中,继承关系默认使用TPH模式。

使用方法:

1、先定义父类。子类继承父类,并实现自己的属性。

2、将父类和子类加入到Context当中。如

public DbSet<Person> People {get;set;}

public DbSet<Instructor> Instructors {get;set;}

public DbSet<Student> Students {get;set;}

这样,在数据库中只会有Person 一张表了,并产生了一个Discriminator 列来区分行是表示 Student还是表示Instructor.

二、TPT的实现

例子:

modelBuilder.Entity<Person>().ToTable("Person");

modelBuilder.Entity<Student>().ToTable("Student");

modelBuilder.Entity<Instructor>().ToTable("Instructor");

三、TPC的实现

例子:

modelBuilder.Entity<Person>() 
    .Property(c => cID) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
 
modelBuilder.Entity<Instructor>().Map(m => 

    m.MapInheritedProperties(); 
    m.ToTable("Instructor"); 
}); 
 
modelBuilder.Entity<Student>().Map(m => 

    m.MapInheritedProperties(); 
    m.ToTable("Student"); 
});

在Entity Framework 中实现继承关系映射到数据库表的更多相关文章

  1. Hibernate中的Entity类之间的继承关系之一MappedSuperclass

    在hibernate中,Entity类可以继承Entity类或非Entity类.但是,关系数据库表之间不存在继承的关系.那么在Entity类之间的继承关系,在数据库表中如何表示呢? Hibernate ...

  2. 将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库

    目的 本教程介绍如何使用 Entity Framework.语言集成查询 (LINQ),以及如何对 Oracle 数据库使用 Model-First 以生成数据定义语言 (DDL) 脚本. 所需时间 ...

  3. Entity Framework 教程——Entity Framework中的实体类型

    Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...

  4. [转]在Entity Framework中使用LINQ语句分页

    本文转自:http://diaosbook.com/Post/2012/9/21/linq-paging-in-entity-framework 我们知道,内存分页效率很低.并且,如果是WebForm ...

  5. Entity Framework 实践系列 —— 搞好关系 - 两情相悦(双向一对一)【转载】

    Entity Framework 实践系列 —— 搞好关系 - 两情相悦(双向一对一) 自从搞好了单向一对一关系,装满代码的心中塞进了挥之不去的情丝 —— 单相思.谁都知道音乐世界离不开情感,可谁又知 ...

  6. Lazy<T>在Entity Framework中的性能优化实践

    Lazy<T>在Entity Framework中的性能优化实践(附源码) 2013-10-27 18:12 by JustRun, 328 阅读, 4 评论, 收藏, 编辑 在使用EF的 ...

  7. 如何处理Entity Framework中的DbUpdateConcurrencyException异常

    1. Concurrency的作用 场景 有个修改用户的页面功能,我们有一条数据User, ID是1的这个User的年龄是20, 性别是female(数据库中的原始数据) 正确的该User的年龄是25 ...

  8. Entity Framework中的几种加载方式

            在Entity Framework中有三种加载的方式,分别是延迟加载,自动加载和显示加载.下面用一个例子来说明:现在有两个表,一个是资料表(Reference),另外一个表是资料分类表 ...

  9. 关于Entity Framework中的Attached报错相关解决方案的总结

    关于Entity Framework中的Attached报错的问题,我这里分为以下几种类型,每种类型我都给出相应的解决方案,希望能给大家带来一些的帮助,当然作为读者的您如果觉得有不同的意见或更好的方法 ...

随机推荐

  1. xgboost调参

    The overall parameters have been divided into 3 categories by XGBoost authors: General Parameters: G ...

  2. BUPT复试专题—分数加法(2014网研)

    题目描述 求2^-a + 2^-b,其中a和b均为正整数,结果用最简分数表示 输入 第一行为测试数据的组数T (1~400).请注意,任意两组测试数据之间相互独立的.每组测试数据一行,包含两个整数a和 ...

  3. [Javascript] Replicate JavaScript Constructor Inheritance with Simple Objects (OLOO)

    Do you get lost when working with functions and the new keyword? Prototypal inheritance can be compl ...

  4. 最小公倍数(Least Common Multiple)

    最小公倍数=两个数的乘积/两个数的最大公约数. 接上篇求最大公约数方法,最小公倍数的代码例如以下: public class LCM { //最小公倍数=两数乘积/最大公约数 public stati ...

  5. MySQL和MongoDB的性能测试

    软硬件环境 MySQL版本:5.1.50,驱动版本:5.1.6(最新的5.1.13有很多杂七杂八的问题) MongoDB版本:1.6.2,驱动版本:2.1 操作系统:Windows XP SP3(这个 ...

  6. google protocol buffer的原理和使用(一)

    一.简单的介绍      Protocol buffers是一个用来序列化结构化数据的技术,支持多种语言诸如C++.Java以及Python语言.能够使用该技术来持久化数据或者序列化成网络传输的数据. ...

  7. CSS属性中Display与Visibility的不同

    大多数人很容易将CSS属性display和visibility混淆,它们看似没有什么不同,其实它们的差别却是很大的.visibility属性用来确定元素是显示还是隐藏,这用visibility=&qu ...

  8. linux UDP,TCP相关特性

    好长时间没使用网络编程忘得差不多了,写了TCP,UDP测试代码,得出以下结论:   一:UDP特性 1. UDP sendto函数不管对端是否存在(即使对端原本存在,现在已经关闭了),都义无反顾的发送 ...

  9. com.mongodb. org.mongodb.

  10. 在Java中如何编写回调函数,以及回调函数的简单应用

    import static java.lang.System.out; import static java.lang.System.err; import java.util.logging.Lev ...