EF中的TPH、TPT、TPC
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的更多相关文章
- Code First 中的 TPH TPT TPC
public class Blog { public int Id { get; set; } public DateTime Creationdate { get; set; } public st ...
- EF中逆变和协变
EF中的增删改查: 实现步骤: 1.声明一个EF的上下文. bjhksjEntities dbContext = new bjhksjEntities(); 2.声明一个实体. HKSJ_USERS ...
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- 2.EF中 Code-First 方式的数据库迁移
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/code-first-migrations-with-entity-framework/ 系列目 ...
- EF中扩展出Between操作符 (修订版)
随手记录一下,这是针对原文错误的修改. 原文:EF中扩展出Between操作符 直接使用是错误的,修改后的扩展方法: /// <summary> /// 扩展 Between 操作符 // ...
- 如何在EF中实现left join(左联接)查询
在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时 ...
- EF中执行sql语句,以及事务
EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...
- EF架构~在ef中支持IQueryable级别的Contains被翻译成了Exists,性能可以接受!
回到目录 Entityframeworks很聪明 不错,非常不错!ef里的contains比linq to sql里的contains有了明显的提升,事实上,是在进行SQL语句翻译上有所提升,在lin ...
- DB表的关系及EF中Fluent API的使用
现在使用多数的数据库是关系型数据库,那么表与表之间的关系就会显得尤其重要,对于数据的CRUD处理和以后数据的分析有很大的好处.下面是对于数据库中对表关系的理解以及在EF中使用Fluent API来创建 ...
随机推荐
- Android -------- 网络访问数据
- java 判断对象是否是某个类的类型方法
class Do1 { public static void main(String[] args) { AA a=new CC(); if(a instanceof CC) { CC b=(CC)a ...
- div+css不间断滚动字幕
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- C++ 知识点1
typedef的陷阱 严格来说typedef并不是定义别名,而是定义类型,比如typedef int a;按照大部分书本说来,就是把a看做int,这种说法初学看来是正确的,也易于理解,但是遇到type ...
- Spring MVC异常处理
Spring Mvc 中异常处理,一般有两种解决办法: 一.利用org.springframework.web.servlet.handler.SimpleMappingExceptionResolv ...
- Linux下添加磁盘创建lvm分区
shell> fdisk /dev/xvdb #### 选择磁盘 Command (m for help): m #### 帮助 Command action a toggle a bootab ...
- Dede文章列表
文章列表标签的使用: {dede:arclist flag='h' typeid='' row='' col='' titlelen='' infolen='' imgwidth='' imgheig ...
- android手机获取手机号
最近做到一个项目,需要获取手机号.项目中使用的手机卡为电信卡,那么就以此为例吧. 网上不符合需求的方法 Google了一下,网上的做法如下: //获取手机号码 TelephonyManager tm ...
- IEqualityComparer<T>接口
IEqualityComparer<T>接口的对象的主要作用在于自定义判断两个对象是否相等. 其中最常用的方法: bool Equals(T x, T y); 实现该方法用于比较两个对象是 ...
- java开发经验分享(三)
三. 项目开发 1. 需求: 1) 需求最终需要开发人员在产品中实现,开发不合理的设计会浪费时间,开发技术无法实现的设计带来最大的痛苦:失败.所以,开发人员要重视需求以及需求评审,提出自己能够想到的所 ...