#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);
});