Базовая таблица EF для каждой иерархии для класса с общим

#c# #oop #entity-framework-core

Вопрос:

В EF Core 3.1.15 я управляю моделью с помощью универсального. Я хотел бы хранить сущности в одной и той же таблице на основе подхода «Таблица по иерархии» (шаблон TPH). Ниже приведена абстрагированная модель. Полученная база данных создает 1 таблицу для Part и потомков с дискриминатором (как и ожидалось), но вместо 1 таблицы для BaseComputer и потомков она создает отдельную таблицу для Computers и отдельную таблицу для Laptops (не ожидается).

 namespace EFGetStarted
{
    public class BloggingContext : DbContext
    {
        public DbSet<Computer> Computers { get; set; }
        public DbSet<Laptop> Laptops { get; set; }
        public DbSet<Part> Parts { get; set; }
    }

    public abstract class BaseComputer<T> where T : Part
    {
        [Key]
        public int Id { get; set; }
        public List<T> Parts { get; set; }
    }

    public class Computer : BaseComputer<Part>
    {
        public string ComputerSpecificProperty { get; set; }
    }

    public class Laptop : BaseComputer<LaptopPart>
    {
        public string LaptopSpecificProperty { get; set; }
    }

    public class Part 
    {
        [Key]
        public int Id { get; set; }
        public string PartName { get; set; }
    }

    public class LaptopPart : Part
    {
        public string LaptopSpecificPartProperty { get; set; }
    }
}
 

Я попытался явно указать сущность как TPH:

 protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<BaseComputer<Part>>()
        .HasDiscriminator()
        .HasValue<Computer>("Computer")
        .HasValue<Laptop>("Laptop");
}
 

Но это не удается со следующим сообщением:

Тип сущности «Ноутбук» не может наследовать от «базового компьютера», поскольку «Ноутбук» не является потомком «базового компьютера».

Вопросы: Могу ли я спроектировать эту модель по схеме TPH? Если нет, то не потому ли, что « Laptop не является потомком BaseComputer<Part> «? И если это так, то почему a не считается потомком и что я должен изменить в классе, чтобы сделать его потомком?

Комментарии:

1. На данный момент я переработал его без общего и поместил Parts свойство в каждый конкретный класс с определенным типом Part . Я все равно предпочел бы иметь универсальный в абстрактном базовом классе, если это возможно.