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日

相关文章

  • C#利用反射来判断对象是否包含某个属性的实现方法

    可以通过反射来动态获取和设置对象的属性值。在C#中,可以使用反射判断某个对象是否包含某个特定属性。下面是使用反射来判断对象是否包含某个属性的实现方法: 1.获取类型对象 使用反射,首先需要获取代表要分析的类型的Type对象。可以通过以下两种方法实现: 使用类型名字符串: Type type = Type.GetType(“命名空间.类名”); 直接通过类类型…

    C# 2023年6月1日
    00
  • JS实现问卷星自动填问卷脚本并在两秒自动提交功能

    JS实现问卷星自动填问卷脚本并在两秒自动提交功能需求主要包括两个部分:一是自动填写问卷;二是在两秒钟内自动提交问卷。 自动填写问卷 首先,我们要查看问卷星的页面源代码,找到需要填写的问题的输入框的相关信息,可以使用Chrome开发者工具或者Firefox的Firebug等浏览器扩展工具。 然后,在代码中用JavaScript代码获取到填写的问题的输入框元素,…

    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 返回随机数实现代码

    ASP.NET 返回随机数实现代码的完整攻略如下: 1. 生成随机数 可以使用 Random 类来生成伪随机数。在 ASP.NET 中,可以使用以下代码来生成一个介于 0 到 10 之间的随机整数: Random rand = new Random(); int randomNumber = rand.Next(0, 11); 这里,我们首先创建了一个 Ra…

    C# 2023年5月31日
    00
  • c# delegate和event的使用说明

    下面是关于”C# delegate和event的使用说明”的完整攻略。 什么是C# delegate? C# delegate是一种类型,该类型可以保存对一个或多个方法的引用并允许在需要时调用这些方法。可以将Delegate看作是函数指针的高级版本。Delegate对象保存的不是方法,而是指向方法的引用。这使得我们可以通过传递委托对象作为参数,从一个方法调用…

    C# 2023年6月7日
    00
  • C#实现用户自定义控件中嵌入自己的图标

    下面是C#实现用户自定义控件中嵌入自己的图标的完整攻略: 步骤一:添加图标资源 用户可以在程序资源文件(.resx)中添加他们自己的图标,以便在自定义控件中使用。首先,需要将图标文件添加到项目的资源文件中,具体步骤如下: 在Visual Studio中打开项目,找到“资源文件”(Resources.resx); 在“资源文件”窗口中,单击“添加资源”按钮,选…

    C# 2023年6月3日
    00
  • DropDownList获取的SelectIndex一直为0的问题

    该问题一般出现在在使用ASP.NET开发Web应用程序时,使用DropDownList控件绑定数据源后无法正确获取所选项索引(SelectIndex)的情况。解决该问题的方法如下: 1.数据源绑定前确保AutoPostBack属性为True 有时候,当DropDownList控件的AutoPostBack属性设置为False时,可能会导致绑定数据源后Sele…

    C# 2023年5月31日
    00
  • C#实现字符串首字母大写的方法示例

    请您耐心阅读以下内容。 C#实现字符串首字母大写方法的完整攻略 字符串首字母大写操作在日常编程中是非常常见的,在C#语言中,实现字符串首字母大写有很多种方法。下面将会介绍两种比较常用的方法。 方法一:Substring方法实现 string str = "hello world"; string firstChar = str.Subst…

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