【问题标题】:How do I model deletion in an EF Core many-to-many relationship?如何在 EF Core 多对多关系中为删除建模?
【发布时间】:2017-04-17 03:16:12
【问题描述】:

我有 followed the docs 使用作为实体公开的连接表来设置我的多对多关系。

但是文档没有提到我应该如何删除。

例如,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() 中使用什么?为什么?

【问题讨论】:

    标签: c# entity-framework ef-code-first entity-framework-core ef-fluent-api


    【解决方案1】:

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

    您应该在此处指定当父记录(StudentTeacher)被删除时,DB 必须对子记录(StudentTeacher)做什么:也删除(Cascade)或禁止并抛出错误(@ 987654326@) 如果对应的子记录存在。对于Restrict,您必须在删除父记录之前手动删除子记录。

    但只有您可以决定必须为每个关系应用什么操作 - 这是您的应用程序,我们不知道它的所有要求。

    重要:对于Cascade,删除,比如说,Teacher 将只影响(删除)StudentTeacher(对应的TeacherId)中的记录,但Students 将被保留完好无损的。

    重要2:在MS SQL Server中(你没有写你正在使用的DB引擎),你可以只设置一个Cascade(其他应该是Restrict),或者应用迁移时会收到错误消息(在表 _some_table_ 上引入 FOREIGN KEY 约束 _some_name_ 可能会导致循环或多个级联路径。

    【讨论】:

    • 我已经知道删除模式之间的区别,但是,这是一个特例,因为它是针对连接表的。与
    • 这正是我应该使用级联还是不使用的问题之一?我做了级联,但级联删除操作正在数据库端运行,如果没有触发器,你将无法取回你的记录。因此,我在用户更新登记表时进行了删除过程,例如将教师删除为学生,反之亦然。因此,我可以跟踪操作并保存记录。也许你也可以这样做@grokky
    • @kizilsu Dmitry 的回答是正确的,并为问题提供了良好的背景。但要决定使用哪种删除模式,请参阅我的回答。
    【解决方案2】:

    一开始对连接表建模似乎令人困惑,因为

    删除Teacher 实体时,您需要删除它与所有Student 实体的关系。删除Student 实体时,需要删除它与所有Teacher 实体的关系。

    所以连接实体必须始终被CASCADE 删除。

    【讨论】:

    • 是的,你是对的。这是我做的大部分关系表。那我不想删除数据库端的关系呢?我需要记录或归档一些重要的关系。在这个教师学生的例子中,这不是必需的,但我有这种情况。你会做什么或建议什么? @grokky
    • @kizilsu 我想最简单的方法是在数据库上设置触发器并以这种方式创建审计日志。或者,将其映射到 EF 中,并在每次删除时创建一个条目。
    • 这不与另一个答案的 Important 2 部分相矛盾吗?据说两个链接实体都不能级联删除,并且至少需要将其中一个实体设置为受限行为。我同意你的推理,但是当我测试时,更新数据库时出错(正如其他答案所暗示的那样)。
    猜你喜欢
    • 2021-03-30
    • 2020-03-23
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2017-11-13
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多