@oleg_ods

EF Наследование. Как настроить абстрактное навигационное свойство?

Помогите решить проблему с EF и наследованием TPH.

Есть студенты и группы(академические, подгруппы и тд.). Студент может быть только в одной академической группе и в нескольких подгруппах.

У меня получилась следующая иерархия:
public class Student
{
    public int Id { get; set; }
    public required string Name { get; set; }
    public int AcademicGroupId { get; set; }

    public AcademicGroup? AcademicGroup { get; set; }
    public IEnumerable<SubGroup>? SubGroups { get; set; }
}

public abstract class Group
{
    public int Id { get; set; }
    public required string Title { get; set; }
    public abstract ICollection<Student>? Students { get; set; }
}

public class AcademicGroup : Group
{
     // some custom properties. 
    public override ICollection<Student>? Students { get; set; }
}

public class SubGroup : Group
{
     // some custom properties. 
    public override ICollection<Student>? Students { get; set; }
}


Настройка DbContext:
protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // Group configuration.
        
        // Academic.  One-to-Many
        modelBuilder.Entity<AcademicGroup>()
            .HasMany(e => e.Students)
            .WithOne(e => e.AcademicGroup)
            .HasForeignKey(e => e.AcademicGroupId);
        
        // SubGroup. Many-to-Many
        modelBuilder.Entity<SubGroup>()
            .HasMany(e => e.Students)
            .WithMany(e => e.SubGroups);

        base.OnModelCreating(modelBuilder);
    }


С запросами типа таких все ок:
await _ctx.AcademicGroups
            .Include(g => g.Students)
            .ToListAsync(cancellationToken);

await _ctx.SubGroups
            .Include(g => g.Students)
            .ToListAsync(cancellationToken);


Но когда пытаюсь заинклюдить студентов через базовую сущность группы(Group), то получаю исключение:
await _ctx.Groups
            .Include(g => g.Students)
            .ToListAsync(cancellationToken);

System.InvalidOperationException: The expression 'g.Students' is invalid inside an 'Include' operation, since it does not represent a property access: 't => t.MyProperty'. To target navigations declared on derived types, us
e casting ('t => ((Derived)t).MyProperty') or the 'as' operator ('t => (t as Derived).MyProperty').


Можно ли как-то вытащить все группы со студентами вне зависимости от типа группы?
  • Вопрос задан
  • 114 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы