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下使用Bundle合并、压缩js与css文件详解

    Asp.net MVC是一个使用Model-View-Controller(MVC)架构模式开发Web应用程序的框架。在Asp.net MVC中,可以使用Bundle来合并、压缩Javascript (JS) 和Cascading Style Sheets (CSS) 文件以提高Web应用程序的性能。下面是使用Bundle合并和压缩JS和CSS文件的完整攻略…

    C# 2023年5月31日
    00
  • PHP采集利器 Snoopy 试用心得

    PHP采集利器Snoopy试用心得 Snoopy是一款PHP采集工具,它可以模拟浏览器发送HTTP请求,获取网页内容,并对网页内容进行解析和处理。Snoopy具有简单易用、功能强大、支持Cookie、支持代理等特点,是PHP开发者进行网页采集和数据抓取的利器。在本文中,我们将介绍如何使用Snoopy进行网页采集,并提供两个示例。 步骤一:下载和安装Snoop…

    C# 2023年5月15日
    00
  • Win11 Dev Build 22000.65开发预览版推送(附更新修复已知问题汇总)

    Win11 Dev Build 22000.65开发预览版推送 微软公司于2021年6月28日推送了 Win11 Dev Build 22000.65开发预览版。这是 Win11 的开发者预览版,意味着可能会存在各种问题,仅供测试和体验使用。本文将为大家详细讲解该版本的更新内容以及已知问题。 更新内容 用户体验 启动菜单 Win11对启动菜单进行了全新设计,…

    C# 2023年6月7日
    00
  • C#可变参数params示例详解

    C#可变参数params示例详解 可变参数(params)概述 在C#中,可变参数可以使用 params 关键字声明,它可以使函数接受可变数量的参数,在函数内使用时,它们是数组类型。这样可以使我们更加方便地使用这些可变数量的参数,而不用在定义参数数量时进行硬编码。 例如: public void Function(params int[] items) 这表…

    C# 2023年5月15日
    00
  • C#实现自定义Dictionary类实例

    这里是C#实现自定义Dictionary类实例的完整攻略: 1. 创建自定义Dictionary类 首先,我们需要创建一个自定义的Dictionary类,我们可以参考.NET Framework中原有的Dictionary类的实现方式,但是需要添加一些自定义的功能。下面是一个基本的实现方式: public class MyDictionary<TKey…

    C# 2023年6月6日
    00
  • C# 使用WPF 用MediaElement控件实现视频循环播放

    下面是关于“C#使用WPF用MediaElement控件实现视频循环播放”的完整攻略,包含两个示例。 1. WPF和MediaElement控件简介 WPF是一种用于创建Windows桌面应用程序的技术,它提供了一种基于XAML的用户界面设计语言。MediaElement控件是WPF中的一个控件,它可以用于播放音频和视频文件。 2. 使用MediaEleme…

    C# 2023年5月15日
    00
  • ASP.NET Core MVC 从入门到精通之wwwroot和客户端库

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年4月22日
    00
  • 聊聊.Net,Core配置Nlog.md的问题

    聊聊.Net Core配置NLog NLog是一个流行的日志记录库,它可以帮助我们在应用程序中记录日志。在本攻略中,我们将介绍如何在.Net Core应用程序中配置NLog,以便记录日志。以下是聊聊.Net Core配置NLog的完整攻略: 步骤一:安装NLog 首先,需要安装NLog。可以使用以下命令在.Net Core应用程序中安装NLog: dotne…

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