EF Core TPH дискриминатор игнорирует базовые объекты

#entity-framework-core

#entity-framework-core

Вопрос:

У меня есть два DbContext. BaseDbContext и тот, который наследуется от BaseDbContext вызываемого FemaleDbContext .

 public class BaseDbContext : DbContext
{
    public BaseDbContext(DbContextOptions options) : base(options) { }

    public virtual DbSet<Person> Person { get; set; }
    public virtual DbSet<House> House { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>().ToTable("Person", "dbo");
        modelBuilder.Entity<House>().ToTable("House", "dbo");

        modelBuilder.Entity<Person>().HasOne(e => e.House).WithMany(e => e.Persons);
        modelBuilder.Entity<House>().HasMany(e => e.Persons).WithOne(e => e.House);
    }
}
  

Цель состоит в том, чтобы расширить Person объект другим свойством. Я не хочу использовать свойства тени, потому что это слишком динамично. Итак, я пытаюсь заставить его работать, используя TPH. Вот мой другой контекст:

 public class FemaleDbContext : BaseDbContext
{
    public DbSet<Female> Female { get; set; }

    public FemaleDbContext(DbContextOptions<FemaleDbContext> options) : base(options) { }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Female>().HasBaseType<Person>();

        base.OnModelCreating(modelBuilder);
    }
}
  

Как вы можете видеть, мой подтекст должен использовать Female объект вместо Person . Проблема в том, что когда я запускаю this.Context.Female.ToList() свой SubDbContext, возвращаются только объекты со значением Female внутри Discriminator поля внутри моей базы данных. Возвращаются объекты со значением Person из этой таблицы. Но я хочу получить каждый объект.

Кроме того, вот мои объекты:

 public class Person
{
    public int Id { get; set; }
    public string Firstname { get; set; }
    public string Middlename { get; set; }
    public string Lastname { get; set; }
}

public class Female : Person
{
    public bool? IsPregnant { get; set; }
}
  

Как я могу настроить мой DbContext, который this.Context.Female.ToList() возвращает оба Females и Persons . Обратите внимание, что this.Context.Person.ToList() уже возвращает все, а не только Persons

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

1. Вы не можете. EF предоставляет вам именно то, что вы просите при выполнении this.Context.Female.ToList() . Предположим, что это не так, как бы вы хотели запрашивать только женщин?

2. @user2877820 Используйте, Context.Person если вы хотите получить все Person . Используйте, Context.Female если вы хотите получить все Female .