如何在EF Core多對多關係中建模刪除?

c# ef-code-first ef-fluent-api entity-framework entity-framework-core

我使用作為實體公開的連接表來跟踪文檔以建立我的多對多關係。

但是文檔沒有提到我應該對刪除做些什麼。

例如, Student有很多老師, Teacher有很多學生。連接實體/表是StudentTeacher

連接表/實體:

public class StudentTeacher {
  public int StudentId { get; set; }
  public Student Student { get; set; }
  public int TeacherId { get; set; }
  public Teacher Teacher { get; set; }
}

連接表/實體的配置:

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? ...*/);

我在OnDelete()使用了什麼?為什麼?

一般承認的答案

首先對連接表進行建模似乎很困惑,因為<= EF6不需要它。但它實際上很簡單。

刪除Teacher實體時,需要刪除與所有Student實體的關係。刪除Student實體時,您需要刪除與所有Teacher實體的關係。

因此,連接實體必須始終被CASCADE刪除。


熱門答案

.OnDelete(/* ... what goes here? ...*/);

當父記錄(在StudentTeacher )被刪除時,你應該在這裡指定DB必須對子記錄(在StudentTeacher )做什麼:如果存在相應的子記錄,則刪除( Cascade )或禁止並拋出錯誤( Restrict )。使用“ Restrict您必須在刪除父記錄之前手動刪除子記錄。

但只有你可以決定每個關係必須採取什麼行動 - 這是你的應用程序,我們不知道它的所有要求。

重要提示 :有Cascade ,刪除,比如, Teacher會影響(刪除)僅在記錄StudentTeacher (相應TeacherId ),但Students將被完整保留。

重要2 :在MS SQL Server中(您沒有編寫正在使用的數據庫引擎),您只能設置一個Cascade (其他應該是Restrict ),否則在應用遷移時會收到錯誤( 引入FOREIGN KEY約束_some_name_ on table _some_table_可能會導致循環或多個級​​聯路徑。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因