码迷,mamicode.com
首页 > 其他好文 > 详细

EF中的TPH、TPT、TPC

时间:2015-06-26 12:22:28      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

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                 });

生成的表结构如下图:

技术分享

 

EF中的TPH、TPT、TPC

标签:

原文地址:http://www.cnblogs.com/goodlucklzq/p/4600561.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!