zoukankan      html  css  js  c++  java
  • 在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"); 
    });
  • 相关阅读:
    权值线段树&&可持久化线段树&&主席树
    扩展中国剩余定理(EXCRT)快速入门
    jquery学习记录
    隐藏vbs执行cmd命令的窗口
    eclipse打开出错 Error: opening registry key 'SoftwareJavaSoftJava Runtime Environment'
    正则表达式学习总结
    什么是xss攻击?
    什么是浏览器的同源策略?
    关于axios的封装
    关于递归。
  • 原文地址:https://www.cnblogs.com/liuyuanhao/p/5384789.html
Copyright © 2011-2022 走看看