• entityframework学习笔记--007-实体数据建模基础之继承关系映射TPT


    Table per Type Inheritance (TPT)建模

    1.假设你有两张表与一张公共的表密切相关,如图7-1所示,Businiss表与eCommerce表、Retail表有1:0...1关系。最关键的是,eCommerce表和Retail表中有关于Business表中代表业务的额外的信息。

    图7-1

    2. 右键你的项目,新建三个实体类,其中eCommerce、Retail继承自Businiss。如下代码:

    1 [Table("Business", Schema = "example7")]
    2     public class Business
    3     {
    4         [Key]
    5         [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    6         public int BusinessId { get; protected set; }
    7         public string Name { get; set; }
    8         public string LicenseNumber { get; set; }
    9     }
    Business
    1 [Table("eCommerce", Schema = "example7")]
    2     public class eCommerce : Business
    3     {
    4         public string URL { get; set; }
    5     }
    eCommerce
    1 [Table("Retail", Schema = "example7")]
    2     public class Retail : Business
    3     {
    4         public string Address { get; set; }
    5         public string City { get; set; }
    6         public string State { get; set; }
    7         public string ZIPCode { get; set; }
    8     }
    Retail

    3.创建一个继承自DbContext的上下文对象EF6RecipesContext;

     1 public class EF6RecipesContext : DbContext
     2     {
     3         public DbSet<Business> Businesses { get; set; }
     4         public EF6RecipesContext()
     5             : base("name=EF6CodeFirstRecipesContext")
     6         {
     7         }
     8         protected override void OnModelCreating(DbModelBuilder modelBuilder)
     9         {
    10 
    11         }
    12     }
    EF6RecipesContext

    4.测试代码:

     1 using (var context = new EF6RecipesContext())
     2             {
     3                 var business = new Business
     4                 {
     5                     Name = "Corner Dry Cleaning",
     6                     LicenseNumber = "100x1"
     7                 };
     8                 context.Businesses.Add(business);
     9                 var retail = new Retail
    10                 {
    11                     Name = "Shop and Save",
    12                     LicenseNumber = "200C",
    13                     Address = "101 Main",
    14                     City = "Anytown",
    15                     State = "TX",
    16                     ZIPCode = "76106"
    17                 };
    18                 context.Businesses.Add(retail);
    19                 var web = new eCommerce
    20                 {
    21                     Name = "BuyNow.com",
    22                     LicenseNumber = "300AB",
    23                     URL = "www.buynow.com"
    24                 };
    25                 context.Businesses.Add(web);
    26                 context.SaveChanges();
    27             }
    28 
    29             using (var context = new EF6RecipesContext())
    30             {
    31                 Console.WriteLine("
    --- All Businesses ---");
    32                 foreach (var b in context.Businesses)
    33                 {
    34                     Console.WriteLine("{0} (#{1}).{2}", b.Name, b.LicenseNumber,b.BusinessId);
    35                 }
    36 
    37                 Console.WriteLine("
    --- Retail Businesses ---");
    38                 foreach (var r in context.Businesses.OfType<Retail>())
    39                 {
    40                     Console.WriteLine("{0} (#{1}).{2}", r.Name, r.LicenseNumber,r.BusinessId);
    41                     Console.WriteLine("{0}", r.Address);
    42                     Console.WriteLine("{0}, {1} {2}", r.City, r.State, r.ZIPCode);
    43                 }
    44 
    45                 Console.WriteLine("
    --- eCommerce Businesses ---");
    46                 foreach (var e in context.Businesses.OfType<eCommerce>())
    47                 {
    48                     Console.WriteLine("{0} (#{1}).{2}", e.Name, e.LicenseNumber,e.BusinessId);
    49                     Console.WriteLine("Online address is: {0}", e.URL);
    50                 }
    51             }
    View Code

    输出:

    5. TPT是实体框架支持三个继承映射中的一个,另外两个分别是Table per Hierarchy(TPH),和Table per Concrete Type(TPC),将在本章后面部分讨论。

      TPT继承映射提供了数据库方面的灵活性,作为开发人员,我们可以很容易在模型中为新加的表添加派生类型。但是,每个派生类型都会涉及一个额外的join连接,这会降低系统的性能。 在真实的应用中,我们已经看到当派生类型很多时,使用TPT继承映射所带来的性能问题。

      Table per hierarchy(TPH)继承映射。它将整个继承类型存储在一张单独的表中,他解决了TPT中的join连接问题,并带来了好的性能。但牺牲了数据库的灵活性。

      Table per concrete(TPC)继承映射,它被实体框架于运行时所支持,但不被设计器支持。

  • 相关阅读:
    Python2-列表
    C#1-变量和表达式
    Python1-变量
    grep输出带有颜色设置
    ftp服务器的安装与使用
    慕课网-哒哒租车系统
    ulimit 命令
    ARP与RARP
    return 和exit
    java运行机制
  • 原文地址:https://www.cnblogs.com/renjing/p/ef_tpt.html
Copyright © 2020-2023  润新知