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日

相关文章

  • C#实现判断操作系统是否为Win8以上版本

    要实现判断操作系统是否为Windows 8及以上版本,可以用C#语言编写以下代码: using System; using System.Runtime.InteropServices; class OperatingSystemUtils { [DllImport("kernel32.dll")] static extern bool …

    C# 2023年6月2日
    00
  • C#实现让窗体获得焦点的方法示例

    当一个窗体生成后,有时我们需要让该窗体获得焦点,以便用户能够直接通过键盘或鼠标与该窗体进行交互。在C#中,可以通过调用窗体的Focus()方法来使窗体获得焦点。 以下是C#实现让窗体获得焦点的示例: 示例一 // 在窗体的构造函数中调用Focus方法 public Form1() { InitializeComponent(); this.Focus(); …

    C# 2023年5月31日
    00
  • 解析ASP.NET Core中Options模式的使用及其源码

    解析ASP.NET Core中Options模式的使用及其源码攻略 ASP.NET Core中Options模式是一种用于配置应用程序的机制。在本攻略中,我们将深入讨Options模式的使用及其源码,并提供两个示例说明。 Options模式的使用 在ASP.NET Core中,Options模式是一种用于配置应用程序的机制。Options模式允许您将配置数据…

    C# 2023年5月17日
    00
  • 将Access数据库中数据导入到SQL Server中的详细方法实例

    下面是将Access数据库中数据导入到SQL Server中的详细方法实例。 1. 概述 Access是Microsoft Office套件中的一个关系型数据库程序,而SQL Server是Microsoft开发的一种关系型数据库管理系统,两者都可以用来管理数据。有时,我们需要将Access数据库中的数据导入到SQL Server中,这样可以更好地管理和处理…

    C# 2023年5月31日
    00
  • c#通用登录模块分享

    C#通用登录模块分享 在网站或应用程序中,用户通常需要进行登录才能使用其功能。为了节省开发人员的时间和精力,我们可以编写一个通用登录模块,以供多个网站或应用程序共用。本篇文章将详细介绍如何实现这个通用登录模块。 实现基础功能 创建用户表 首先,我们需要在数据库中创建一个用户表(如MySQL、SQL Server、Oracle等),用于保存用户的登录信息。用户…

    C# 2023年5月31日
    00
  • C# String.Join()方法: 将一个字符串数组的所有元素连接成一个字符串

    C#中的String类拥有Join()方法,它是用来连接字符串数组中的所有元素,返回一个新的字符串。下面是该函数的定义和使用方法: string.Join(string separator, params object[] values) 其中,参数separator是一个字符串,用于分割数组中的元素;参数values是object类型的数组,表示被连接的字…

    C# 2023年4月19日
    00
  • C#实现多线程编程的简单案例

    下面是 C# 实现多线程编程的简单案例的攻略,分为以下几个步骤: 1. 确定需求及问题 在开始之前,需要确定要实现的需求和问题,这样才能更有针对性地编写代码。例如,本次案例要实现的问题可能是:在一个列表中,同时处理多个元素的计算任务,并等待所有计算任务完成后,将结果汇总并输出。 2. 创建多线程 在确定了需求和问题后,需要使用 C# 中的多线程机制来实现。创…

    C# 2023年5月15日
    00
  • C#异步的世界(下)

    当异步操作越来越普及,开发者在C#异步编程中应该如何实现呢?本文将继续讲解C#异步的世界(下),从Task和async/await的用法及实现机制,以及TPL的使用等方面进行详细介绍,帮助读者更好地掌握异步编程。 Task和async/await Task的定义和用法 Task是.NET Framework 4.0中新增的一种类型,用于表示尚未完成的操作。通…

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