Entity Framework映射TPH、TPT、TPC与继承类

Entity Framework是一种ORM(Object Relational Mapping)框架,通过实体映射来将数据库中的表映射到代码中的类。当数据库中的表存在继承关系时,Entity Framework提供了三种继承映射策略:TPH、TPT、TPC。

TPH

TPH(Table Per Hierarchy)策略将整个继承关系映射到同一张表中,该表有一个Discriminator列用于区分不同的子类。示例代码如下:

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Manager : Employee
{
    public string Department { get; set; }
}

public class Developer : Employee
{
    public string ProgrammingLanguage { get; set; }
}

public class MyDbContext : DbContext
{
    public DbSet<Employee> Employees { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Employee>()
                    .Map<Manager>(m =>
                    {
                        m.Requires("EmployeeType").HasValue("Manager");
                        m.Properties(p => new { p.Id, p.Name, p.Department });
                    })
                    .Map<Developer>(d => 
                    {
                        d.Requires("EmployeeType").HasValue("Developer");
                        d.Properties(p => new { p.Id, p.Name, p.ProgrammingLanguage });
                    })
                    .ToTable("Employees");
    }
}

上面的示例中,Employee作为基类,Manager和Developer作为其子类,整个继承关系映射到同一张表Employees中。Employee类没有任何映射配置,Manager和Developer分别通过Map方法进行映射配置,且都要指定Discriminator列的值。

TPT

TPT(Table Per Type)策略将每个子类映射到单独的表中,基类中的属性也会在每个子类对应的表中生成。示例代码如下:

public class Animal
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class Cat : Animal
{
    public string EyeColor { get; set; }
}

public class Dog : Animal
{
    public string FurColor { get; set; }
}

public class MyDbContext : DbContext
{
    public DbSet<Animal> Animals { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Cat>()
                    .ToTable("Cats");
        modelBuilder.Entity<Dog>()
                    .ToTable("Dogs");
    }
}

上面的示例中,Animal作为基类,Cat和Dog作为其子类,每个子类都映射到单独的表中。基类中的属性也会在每个子类对应的表中生成,所以Animal表不需要映射。

TPC

TPC(Table Per Concrete Type)策略将每个子类映射到单独的表中,但不包括基类中的属性。示例代码如下:

public abstract class Shape
{
    public int Id { get; set; }
}

public class Rectangle : Shape
{
    public int Width { get; set; }
    public int Height { get; set; }
}

public class Circle : Shape
{
    public int Radius { get; set; }
}

public class MyDbContext : DbContext
{
    public DbSet<Rectangle> Rectangles { get; set; }
    public DbSet<Circle> Circles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Rectangle>()
                    .ToTable("Rectangles");
        modelBuilder.Entity<Circle>()
                    .ToTable("Circles");
    }
}

上面的示例中,Shape作为基类,Rectangle和Circle作为其子类,每个子类都映射到单独的表中。但基类中的属性不会在子类对应的表中生成,所以需要在每个子类中重新定义Id属性。

通过上述示例,相信你已经了解了Entity Framework中继承映射的三种策略:TPH、TPT、TPC。在实际开发中可以根据具体需求选择不同的策略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Entity Framework映射TPH、TPT、TPC与继承类 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • ASP.NET(C#) 面试总结面试题大全

    标题规范: 在markdown中,标题通过在文本前添加#号表示。一级标题需要1个#号,二级标题需要2个#号,以此类推。例如,一级标题的写法为: # 一级标题 二级标题的写法为: ## 二级标题 代码块规范: 在markdown中,代码块通过使用三个`来表示代码块的开始和结束,示例如下: public static void main(String[] arg…

    C# 2023年5月14日
    00
  • 浅谈C# AOP的简单实现

    我会详细讲解“浅谈C# AOP的简单实现”的完整攻略,包含以下几个方面: 什么是AOP? C#中AOP的实现方式 AOP的简单实现过程 示例1:使用AOP实现计算方法的执行时间 示例2:使用AOP实现方法调用前后打印日志 1. 什么是AOP? AOP(Aspect-Oriented Programming)即面向切面编程,它是一种软件开发的方法论,能够将系统…

    C# 2023年5月15日
    00
  • C# 实现抓包的实例代码

    下面是详细的“C# 实现抓包的实例代码”的攻略。 一、背景介绍 在网络通讯过程中,我们需要获取通讯双方的数据,这个获取的过程就是网络抓包。在 C# 中,我们可以通过使用第三方库 SharpPcap 实现抓包。下面将会对使用 SharpPcap 进行网络抓包的实现过程进行详细讲解。 二、环境准备 在进行网络抓包之前,需要在计算机上安装 WinPcap。WinP…

    C# 2023年6月1日
    00
  • C#使用Lambda表达式简化代码的示例详解

    这里是C#使用Lambda表达式简化代码的示例详解。 Lambda表达式简介 Lambda表达式是C# 3.0 中引入的一种新的语法特性,广泛用于简化代码,特别是在LINQ查询和事件处理中。Lambda表达式可以看作是一种匿名函数,它不需要方法名,可以在其他方法中定义,非常方便。Lambda表达式的语法形式为: (parameters) => expr…

    C# 2023年5月31日
    00
  • C#编程获取各种电脑硬件信息的方法示例

    C#是一种流行的面向对象编程语言,可以获取电脑硬件信息,并且是比较容易实现的。下面,我将分享一些示例代码,用以获得各种电脑硬件信息的方法。 硬件信息获取方法一:使用System.Management命名空间 System.Management命名空间提供了一种获取WMI(Windows Management Instrumentation)服务的方法,该服务…

    C# 2023年6月7日
    00
  • .NET 水晶报表使用代码

    下面是 “.NET 水晶报表使用代码” 的完整攻略: 1. 安装Crystal Reports 首先需要安装 Crystal Reports,这里简单介绍一下安装步骤: 在 Visual Studio 中,打开 “工具” -> “扩展和更新”。 在 “扩展和更新” 窗口中,选择 “联机” 选项卡。 搜索 “Crystal Reports”,并安装最新的…

    C# 2023年5月31日
    00
  • C#怎样才能实现窗体最小化到托盘呢?

    要实现C#窗体最小化到托盘,需要以下几步: 1.添加命名空间 需要添加System.Windows.Forms命名空间来使用NotifyIcon类。 using System.Windows.Forms; 2.创建NotifyIcon对象 在窗体类中定义一个NotifyIcon对象,用来实现窗体最小化后显示在系统托盘中。 private System.Win…

    C# 2023年6月6日
    00
  • C#中单问号(?)和双问号(??)的用法整理

    C#中单问号(?)和双问号(??)的用法整理 一、单问号(?) 在C#中,单问号(?)用来判断对象是否为null。如果对象为null,则返回null;否则返回对象的值。 1.1. 使用示例 int? num = null; int? num2 = 7; Console.WriteLine(num?.ToString()); // 输出null Console…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部