#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
. Я все равно предпочел бы иметь универсальный в абстрактном базовом классе, если это возможно.