Каскадное удаление в таблице по типу(TPT) EF Core 5

#c# #asp.net-core #.net-core #entity-framework-core

Вопрос:

У меня есть два менеджера по персоналу, и я использую ef core 5.

 public class Employee
{
        public long Id{ get; private set; }
        public string FirstName { get; private set; }
        public string LastName { get; private set; }
}

public class Manager : Employee
{
        public long StoreId{ get; private set; }
}
 

Я использую тип для каждой таблицы, используя fluent api

 class EmployeeConfiguration : IEntityTypeConfiguration<Employee>
    {

        public void Configure(EntityTypeBuilder<Employee> builder)
        {
            builder.ToTable("Employee");
            builder.HasKey(x => x.Id);    

        }
    }

class ManagerConfiguration : IEntityTypeConfiguration<Manager>
    {

        public void Configure(EntityTypeBuilder<Manager> builder)
        {
            builder.ToTable("Manager");
        }
    }
 

В результате у меня есть две таблицы. Проблема в том, что мне нужен каскад действий по удалению, когда я удаляю сотрудника , я хочу удалить и запись таблицы менеджера.
Но поведение по умолчанию не таково. Когда я пытаюсь удалить родительскую запись, у меня возникает нарушение fk

Как я могу настроить OnDelete в таблице для каждого типа?

ОТРЕДАКТИРУЙТЕ ядро EF, чтобы понять взаимосвязь, и после миграции создайте

 b.HasOne(".......Employee", null)
                        .WithOne()
                        .HasForeignKey("....Manager", "Id")
                        .OnDelete(DeleteBehavior.ClientCascade)
                        .IsRequired();
 

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

1. Не уверен, каковы здесь отношения между Сотрудником и Менеджером. Я не вижу никаких FKS.

2. @Morse я обновил вопрос

3. По-прежнему не вижу никаких FK в классах сущностей. Кроме того, «ClientCascade» означает «удалить эту сущность при удалении родительской сущности». Если вы хотите, чтобы «менеджер» был удален вместе с «сотрудником», это означает, что у менеджера должна быть ссылка на сотрудника и установлено каскадное удаление, а не наоборот.

4. @Morse вам не нужно настраивать fk. Таблица подклассов имеет идентификатор, который является pk и fk о суперклассе Pk learnentityframeworkcore5.com/whats-new-in-ef-core-5/…

Ответ №1:

Я знаю, что это старо. Но вот как я это сделал на случай, если кто-то смотрит.

 modelBuilder.Entity<Manager>(entity =>
{
    entity.ToTable("Manager")
        .HasOne<Employee>()
        .WithOne()
        .HasForeignKey<Manager>(x => x.Id)
        .OnDelete(DeleteBehavior.Cascade);
});