【问题标题】:Avoiding cyclic cascading with n-to-m relations and a parent in EF Core 2.2 with Fluent API使用 Fluent API 在 EF Core 2.2 中避免使用 n 到 m 关系和父级的循环级联
【发布时间】:2019-12-13 09:38:01
【问题描述】:

按照1-to-m 结合n-to-m 的配置指南,我建立了一个包含多个学生课程学校系统> 实例。每个Student 实例可能包含一个指向某个Course 实例的链接(反之亦然)。 Student 实例可以包含多个这样的链接(反之亦然)。

这适用于那些指南。但是当组合它们时,我在更新数据库时收到以下错误消息,尽管这样的迁移是正确生成的。

在表“Student_Course”上引入 FOREIGN KEY 约束“FK_Student_Course_Students_StudentId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。查看以前的错误。

过了一会儿,我意识到问题的发生是由于我的学校在删除学生和课程时级联。反过来,它们与它们之间的 n 对 m 关系具有级联关系。这是一个嘘声,因为一旦删除,就无法重新删除。

复杂之处在于我可能只删除一门课程(然后想从中级联),但我也可能只删除一个学生(并希望从中级联)。

所以我需要涵盖以下情况。

  1. 学校已删除 -> 每个学生已删除,每个课程已删除,每个学生课程已删除
  2. 学生已删除 -> 学生课程推荐已删除
  3. 课程已删除 -> 学生课程推荐已删除

我应该如何重新配置​​我的模型构建器以仅导致一个删除分支?

当前配置是这样设置的。

builder.Entity<Student_Course>().HasKey(sc => new { sc.StudentId, sc.CourseId });
builder.Entity<School>().HasMany(e => e.Courses)
  .WithOne(e => e.School).HasForeignKey(e => e.SchooldId);
builder.Entity<School>().HasMany(e => e.Students)
  .WithOne(e => e.School).HasForeignKey(e => e.SchooldId);

模型看起来像这样。

public class School
{
  public Guid Id { get; set; }
  public virtual IList<Student> Students { get; set; }
  public virtual IList<Course> Courses { get; set; }
}

public class Student
{
  public Guid Id { get; set; }
  public virtual IList<Student_Course> Student_Course { get; set; }
  public Guid SchooldId { get; set; }
  public virtual School School { get; set; }
}

public class Course
{
  public Guid Id { get; set; }
  public virtual IList<Student_Course> StudentCourses { get; set; }
  public Guid SchooldId { get; set; }
  public virtual School School { get; set; }
}

public class Student_Course
{
  public Guid StudentId { get; set; }
  public virtual Student Student { get; set; }
  public Guid CourseId { get; set; }
  public virtual Course Course { get; set; }
}

【问题讨论】:

  • 您必须在 2 和 3 之间进行选择。它们不能同时级联。另一条路径必须手动编程。
  • @GertArnold 感谢您的评论。我不禁想知道为什么会出现这样的限制。毕竟,这并不是那种不寻常的情况。是我不知道的限制背后的技术吗?
  • 这是一个臭名昭著的 Sql Server 限制。

标签: c# ef-code-first ef-fluent-api ef-core-2.2 .net-core-2.2


【解决方案1】:

显然,就像疯狂的窒息一样,这是不可能的。

来源:@gertarnold 提供的“...臭名昭著的 SQL Server 限制...”。

建议的处理方式是手动引入业务逻辑来明确处理。

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 2013-05-21
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多