在Entity Framework 中实现继承关系映射到数据库表
继承关系映射到数据库表中有多种方式:
第一种: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 中实现继承关系映射到数据库表的更多相关文章
- Hibernate中的Entity类之间的继承关系之一MappedSuperclass
在hibernate中,Entity类可以继承Entity类或非Entity类.但是,关系数据库表之间不存在继承的关系.那么在Entity类之间的继承关系,在数据库表中如何表示呢? Hibernate ...
- 将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库
目的 本教程介绍如何使用 Entity Framework.语言集成查询 (LINQ),以及如何对 Oracle 数据库使用 Model-First 以生成数据定义语言 (DDL) 脚本. 所需时间 ...
- Entity Framework 教程——Entity Framework中的实体类型
Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...
- [转]在Entity Framework中使用LINQ语句分页
本文转自:http://diaosbook.com/Post/2012/9/21/linq-paging-in-entity-framework 我们知道,内存分页效率很低.并且,如果是WebForm ...
- Entity Framework 实践系列 —— 搞好关系 - 两情相悦(双向一对一)【转载】
Entity Framework 实践系列 —— 搞好关系 - 两情相悦(双向一对一) 自从搞好了单向一对一关系,装满代码的心中塞进了挥之不去的情丝 —— 单相思.谁都知道音乐世界离不开情感,可谁又知 ...
- Lazy<T>在Entity Framework中的性能优化实践
Lazy<T>在Entity Framework中的性能优化实践(附源码) 2013-10-27 18:12 by JustRun, 328 阅读, 4 评论, 收藏, 编辑 在使用EF的 ...
- 如何处理Entity Framework中的DbUpdateConcurrencyException异常
1. Concurrency的作用 场景 有个修改用户的页面功能,我们有一条数据User, ID是1的这个User的年龄是20, 性别是female(数据库中的原始数据) 正确的该User的年龄是25 ...
- Entity Framework中的几种加载方式
在Entity Framework中有三种加载的方式,分别是延迟加载,自动加载和显示加载.下面用一个例子来说明:现在有两个表,一个是资料表(Reference),另外一个表是资料分类表 ...
- 关于Entity Framework中的Attached报错相关解决方案的总结
关于Entity Framework中的Attached报错的问题,我这里分为以下几种类型,每种类型我都给出相应的解决方案,希望能给大家带来一些的帮助,当然作为读者的您如果觉得有不同的意见或更好的方法 ...
随机推荐
- js监听鼠标点击操作
element.addEventListener('click', function() { /* do stuff here*/ }, false);
- 查询公司外网ip方法
curl -s "http://checkip.dyndns.org/"|cut -f 6 -d" "|cut -f 1 -d"<" ...
- 使用crontab定时执行脚本时别忘了输出重定向>
原文:https://blog.csdn.net/solmyr_biti/article/details/50683279 -------------------------------------- ...
- Android 最新控件 Toolbar
之前Android的ActionBar好像做项目从没用过.除了google自己,并没有多少人用,究其原因,主要是由于ActionBar不够灵活,不可以随心所欲的定制,后来Goole也发现了这一点,然后 ...
- java中简单字符替换
在网络编程中,假设URL含有特殊字符,如空格.'#'等,server将无法识别导致无法获得正确的參数值.我们须要将这些特殊字符转换成server能够识别的字符,比如将空格转换成'%20'.给定一个字符 ...
- cocos2d-x 3.2 移植到android
前人栽树,后人乘凉,这句话有点过了,只是想感谢一下为了移植cocos2d-x到android的"大婶"们所做出的贡献. 首先android环境需要配置好,需要的文 ...
- Spark-1.5.2之改动源代码后的自己定义打包编译
Spark-1.5.2之自己定义打包编译,基于当前最新版本号的spark源代码1.5.2版本号. 自己编译spark是改动spark源代码的必备条件,改动的源代码自己定义打包生效后才干公布到生产环境中 ...
- Flume接收器组的指数退避上限
指数退避 agent.sinkgroups.sg1.sinks=k1,k2,k3agent.sinkgroups.sg1.processor.type=failoveragent.sinkgroups ...
- pyspark mongodb yarn
from pyspark.sql import SparkSession my_spark = SparkSession \ .builder \ .appName("myApp" ...
- Deep Learning 36:python中的一些函数
1.map(function, sequence[, sequence, ...])函数:返回一个list作用:map的作用是以参数序列中的每一个元素调用function函数,返回包含每次functi ...