zoukankan      html  css  js  c++  java
  • EF中的TPH、TPT、TPC

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

    生成的表结构如下图:

  • 相关阅读:
    云计算设计模式(十一)——健康端点监控模式
    大数据R语言简析
    git查看/修改 用户名和邮箱
    MySQL查询和修改auto_increment的方法
    git 配置用户名和邮箱
    discuz安装小云app
    二维码转化为链接
    discuz更换域名,登录不了解决
    数据结构很重要
    C++ vector错误(1)
  • 原文地址:https://www.cnblogs.com/goodlucklzq/p/4600561.html
Copyright © 2011-2022 走看看