Ho seguito i documenti per impostare la mia relazione molti-a-molti, utilizzando una tabella di join che è esposta come entità.
Ma i documenti non menzionano cosa dovrei fare per la cancellazione.
Quindi, ad esempio, uno Student
ha molti insegnanti e un Teacher
ha molti studenti. L'entità / tabella di StudentTeacher
è StudentTeacher
.
La tabella / entità di join:
public class StudentTeacher {
public int StudentId { get; set; }
public Student Student { get; set; }
public int TeacherId { get; set; }
public Teacher Teacher { get; set; }
}
La configurazione per la tabella / entità di join:
modelBuilder.Entity<StudentTeacher>()
.HasOne(b => b.Teacher)
.WithMany(b => b.StudentTeachers)
.HasForeignKey(b => b.TeacherId)
.IsRequired()
.OnDelete(/* ... what goes here? ...*/);
modelBuilder.Entity<StudentTeacher>()
.HasOne(b => b.Student)
.WithMany(b => b.StudentTeachers)
.HasForeignKey(b => b.StudentId)
.IsRequired()
.OnDelete(/* ... what goes here? ...*/);
Cosa uso in OnDelete()
? E perché?
In un primo momento sembra confuso modellare la tabella di join, perché <= EF6 non ne ha avuto bisogno. Ma è in realtà semplice.
Quando si elimina un'entità Teacher
, è necessario eliminare le sue relazioni con tutte le entità Student
. Quando si elimina un'entità Student
, è necessario eliminare le sue relazioni con tutte le entità Teacher
.
Quindi unire le entità deve sempre essere eliminato CASCADE
.
.OnDelete(/* ... what goes here? ...*/);
È necessario specificare qui cosa deve fare DB con i record figlio (in StudentTeacher
) quando vengono eliminati i record padre (in Student
o Teacher
): elimina anche ( Cascade
) o proibisci e genera un errore ( Restrict
) se esiste un record figlio corrispondente. Con Restrict
è necessario eliminare manualmente i record figlio prima di eliminare quello principale.
Ma solo tu puoi decidere quale azione deve essere applicata per ogni relazione: questa è la tua applicazione, non conosciamo tutti i requisiti.
Importante : con Cascade
, l'eliminazione, ad esempio, del Teacher
influirà (eliminerà) solo i record in StudentTeacher
(con TeacherId
corrispondente), ma gli Students
saranno mantenuti intatti.
Importante 2 : in MS SQL Server (non hai scritto il motore DB che stai utilizzando), puoi impostarne uno solo in Cascade
(l'altro dovrebbe essere Restrict
), o riceverai errori quando applichi la migrazione ( Introducendo il vincolo FOREIGN KEY _some_name_ su table _some_table_ potrebbe causare cicli o più percorsi a cascata. )