EF Core Table Splitting - Одна таблица для нескольких классов

В моей таблице четыре столбца, и я хочу разделить ее на несколько классов.

table1
 key
 col1
 col2
 col3
 col4

Class ClassA 
  key
  col1
  col2

class ClassB
   key
   col3
   col4

. ModelBuilder.Entity() ToTable("таблица1");
. ModelBuilder.Entity() ToTable("таблица1");

В настоящее время это дает мне

System.InvalidOperationException: "Невозможно использовать таблицу" table1 "для типа сущности" ClassB ", поскольку она используется для типа сущности" ClassA "

Возможно ли это в EF Core?

Спасибо

1 ответ

Вы можете определить базовый класс для ClassA и ClassB:

abstract class ClassBase
{
    public int Key { get; set; }
}

public class ClassA : ClassBase
{
    public int Col1 { get; set; }
    public int Col2 { get; set; }
}

public class ClassB : ClassBase
{
    public int Col3 { get; set; }
    public int Col4 { get; set; }
}

Затем вы можете определить следующее отображение:

    modelBuilder.Entity<ClassA>().HasBaseType<ClassBase>();
    modelBuilder.Entity<ClassB>().HasBaseType<ClassBase>();

Это создаст столбцы таблицы:

  • ключ
  • Col1 (обнуляемый)
  • Col2 (обнуляемый)
  • Col3 (обнуляемый)
  • Col4 (обнуляемый)
  • дискриминатор

Дискриминатор столбец для определения типа объекта. Вы можете управлять этим столбцом методами HasDiscriminator. Вместо определения сущностей, как указано выше, вы можете использовать, например:

    modelBuilder.Entity<ClassBase>().HasDiscriminator<int>("ClassType")
                .HasValue<ClassA>(1)
                .HasValue<ClassB>(2);

Возможно, вам понадобятся отношения, определенные следующим образом, на основе этих документов MS:

modelBuilder.Entity<ClassA>()
    .HasOne(e => e.ClassB).WithOne(e => e.ClassA)
    .HasForeignKey<ClassB>(e => e.Key);
modelBuilder.Entity<ClassA>().ToTable("Products");
modelBuilder.Entity<ClassB>().ToTable("Products");
Другие вопросы по тегам