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

Entity Framework是一种ORM(Object-Relational Mapping)技术,可以将对象映射到数据库中的关系表。在Entity Framework中,支持三种继承映射策略:TPH(Table Per Hierarchy)、TPT(Table Per Type)和TPC(Table Per Concrete class)。

TPH(Table Per Hierarchy)

TPH是一种将多个实体类型映射到单个表的继承映射策略。使用该策略,每个继承类型都会有一个唯一的类型标识符(Discriminator)。该标识符将用于区分类型并将它们存储在单个表中。

例如,我们有一个表格名为Animal,一个抽象类AnimalBase,有两个类DogCat,其中DogCat都是从AnimalBase派生而来的。现在我们要将DogCat映射到Animal表中。我们可以使用以下代码:

public abstract class AnimalBase
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Dog : AnimalBase
{
    public string Breed { get; set; }
}

public class Cat : AnimalBase
{
    public int Lives { get; set; }
}

public class AnimalContext : DbContext
{
    public DbSet<AnimalBase> Animals { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AnimalBase>()
            .Map<Dog>(m => m.Requires("Discriminator").HasValue("Dog"))
            .Map<Cat>(m => m.Requires("Discriminator").HasValue("Cat"));
    }
}

在上面的代码中,OnModelCreating方法用来配置DbContext模型。我们使用Map方法将DogCat映射到AnimalBase表中,并且都设置了不同的Discriminator值。当我们从数据库中检索数据时,Entity Framework将根据Discriminator值实例化相应的对象。

TPT(Table Per Type)

TPT是一种将每个继承类型映射到自己的表的继承映射策略。使用该策略,每个类型都会有自己的表格,其中包含其自身的属性。父类的属性将在每个类型的表中存在。

例如,我们使用同样的布局,但是我们想要将每个实体映射到自己的表中。我们可以使用以下代码:

public abstract class AnimalBase
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Dog : AnimalBase
{
    public string Breed { get; set; }
}

public class Cat : AnimalBase
{
    public int Lives { get; set; }
}

public class AnimalContext : DbContext
{
    public DbSet<AnimalBase> AnimalBases { get; set; }
    public DbSet<Dog> Dogs { get; set; }
    public DbSet<Cat> Cats { get; set; }

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

在上面的代码中,我们分别创建了DogsCats表,每个表格都包含继承类型自己的属性,以及从父类继承的公共属性。

TPC(Table Per Concrete class)

TPC是一种将每个非抽象继承类型映射到自己的表的继承映射策略。使用该策略,每个类型都将映射到自己的表中,其中包含它自己的属性以及从父类继承的属性。

例如,我们使用同样的布局,但是我们只想将实例化的类型映射到单独的表中。我们可以使用以下代码:

public abstract class AnimalBase
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Dog : AnimalBase
{
    public string Breed { get; set; }
}

public class Cat : AnimalBase
{
    public int Lives { get; set; }
}

public class AnimalContext : DbContext
{
    public DbSet<Dog> Dogs { get; set; }
    public DbSet<Cat> Cats { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Dog>()
            .Map(m => m.ToTable("Dogs"))
            .HasKey(d => d.Id);
        modelBuilder.Entity<Cat>()
            .Map(m => m.ToTable("Cats"))
            .HasKey(c => c.Id);
    }
}

在上面的代码中,我们使用.Map方法将DogCat映射到各自的表中。由于每个表都有自己的Id属性,我们还必须使用.HasKey方法定义主键.

至此,我们完整讲解了Entity Framework映射TPH、TPT、TPC与继承类的攻略。

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

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • ASP.NET MVC SSO单点登录设计与实现代码

    ASP.NET MVC SSO单点登录(Single Sign-On)是一种在多个应用程序中使用相同的身份验证凭据登录的方案。在这种方案中,用户只需一次登录,即可轻松访问所有相关的应用程序。 下面是ASP.NET MVC SSO单点登录设计与实现的完整攻略: 1. 认识 SSO 单点登录 单点登录是一种用户只需登录一个系统就可以实现多系统认证的场景。SSO …

    C# 2023年5月31日
    00
  • c#在sql中存取图片image示例

    下面我将为您详细讲解如何使用C#在SQL中存取图片的完整攻略。 1. 创建存储图片的表 首先,需要在SQL Server中创建一个表来存储图片。以下是一个简单的示例表: CREATE TABLE Images( ImageID INT IDENTITY(1,1) PRIMARY KEY, ImageName VARCHAR(100), ImageData V…

    C# 2023年6月2日
    00
  • c# 使用线程对串口serialPort进行收发数据(四种)

    下面将给出“C# 使用线程对串口SerialPort进行收发数据(四种)”的详细攻略。 一、准备工作 在进行串口收发数据的处理前,需要进行一些准备工作: 引入System.IO.Ports命名空间; 创建SerialPort对象,配置串口参数; 确保串口已正常打开。 二、使用线程进行串口数据收发 1. 使用Thread类 使用Thread类可以使代码执行在一…

    C# 2023年6月7日
    00
  • C#强制类型转换小结

    C#强制类型转换小结 在C#中,类型转换是将一个数据类型的值转换为另一个数据类型的过程。在某些情况下,编译器可以自动执行类型转换,这称为隐式类型转换。但是在其他情况下,需要手动控制类型转换,这称为强制类型转换。 强制类型转换的语法 强制类型转换可以通过使用括号和类型名称来实现。语法如下: (type) expression 其中,type 是要转换成的类型,…

    C# 2023年5月15日
    00
  • Unity实现已知落点和速度自动计算发射角度

    接下来我将对“Unity实现已知落点和速度自动计算发射角度”的攻略进行详细讲解,并提供两个示例说明。 一、问题背景 在某些游戏或模拟应用中,我们需要计算发射物体的发射角度,使其能够落到指定的位置,并且在指定的速度范围内运动。这时候我们不可能通过手动调整发射角度的方式来实现目标的达成,因为如果落点或速度范围改变,我们需要重新计算发射角度,这是非常麻烦的。因此,…

    C# 2023年6月3日
    00
  • C#图片处理类分享

    C#图片处理类分享 在本文中,我们将分享一些如何使用C#图片处理类(Image class)的技巧和实用示例。这些技巧涵盖的范围包括图片压缩,大小和比例的更改,旋转和翻转图片等。 图片压缩 压缩图片可以减小图片的大小,从而减少图片在服务器上的存储空间和网络传输带宽占用。下面是一个简单的示例,演示如何使用C#的Image类来压缩图片: using System…

    C# 2023年5月31日
    00
  • asp.net错误页面处理示例分享

    下面我就为您详细讲解如何通过ASP.NET处理错误页面。 一、背景知识 在ASP.NET应用程序中,错误处理是非常重要的。如果应用程序在运行时遇到错误,它需要处理错误和向用户提供错误消息。否则,将给用户留下不好的印象,甚至可能导致应用程序的崩溃。ASP.NET提供了一些机制来捕获和处理错误。其中,常用的是处理异常和错误页面。 二、处理异常 处理异常是ASP.…

    C# 2023年5月15日
    00
  • .NET(C#):Emit创建异常处理的方法

    谢谢你的提问,下面我将详细讲解“.NET(C#):Emit创建异常处理的方法”的攻略。 什么是 Emit Emit 是 C# 语言中的一种反射机制,可以动态创建和编译 IL(Intermediate Language)代码。通过 Emit,可以生成动态程序集、动态类型和动态方法等。 如何使用 Emit 创建异常处理的方法 使用 Emit 创建异常处理的方法需…

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