表上的 FK 可能会导致多个周期或多个级联路径



我正在创建一个看起来像这样的数据库: 我有Questions表:

public class Question
{
[Key]
public int Id { get; set; }
public List<Answer> Answers { get; set; }
public List<SendedAnswer> SendedAnswers { get; set; }
}

有人可以向每个问题发送SendedAnswer

public class SendedAnswer
{
[Key]
public int Id { get; set; }
[ForeignKey("Question")]
public int QuestionId{ get; set; }
public Question Question { get; set; }
public List<ExecutionResult> ExecutionResults { get; set; }
}

发送答案时,我的系统会检查答案是否与输出相关

ExecutionResult存储IDSendedAnswerAnswer(我添加了AnswerId,下面显示的错误显示在使用此ID添加新迁移后的update-database输出中)。在我的代码隐藏中,我正在检查与Question相关的AnswersSendedAnswer(发送SendedAnswer以解决一个Question)。

public class ExecutionResult
{
[Key]
public int Id { get; set; }
[ForeignKey("SendedAnswer")]
public int SendedAnswerId { get; set; }
public SendedAnswer SendedAnswer { get; set; }
[ForeignKey("Answer")]
public int AnswerId { get; set; }
public Answer Answer { get; set; }
}

Answers表如下所示:

public class Answer
{
[Key]
public int Id { get; set; }
[ForeignKey("Question")]
public int QuestionId{ get; set; }
public Question Question{ get; set; }
}

使用新列添加迁移以将AnswerId存储在类中ExecutionResult后,出现此错误:

引入外键约束 'FK_dbo.ExecutionResults_dbo。表"执行结果"上的Answers_AnswerId"可能会导致循环或多个级联路径。指定"删除时不执行任何操作"或"更新时不执行任何操作",或修改其他外键约束。 无法创建约束或索引。请参阅以前的错误。

当我将此行添加到我的DbContext(以覆盖的方法)时:

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

我收到错误,我的IdentityUsers缺少几个IDs等(我的 DbContext 继承自IdentityDbContext<User>)。

我的问题是,如何处理此错误?当我在删除路径上收到多个级联时?对我来说,它看起来不错,因为在删除Answer后我想删除ExecutionResult,而且看起来很明显我需要 FKExecutionResult才能AnswerSendedAnswer

如何在没有该错误的情况下将Answers表与ExecutionResult表匹配?我在这里做错了什么?

在外键约束上添加[Required]属性以强制级联删除。 或者,根据需要使用实体框架流畅 API 定义一些其他 OnDelete 行为。(https://www.learnentityframeworkcore.com/configuration/fluent-api/ondelete-method)

OnModelCreating(DbModelBuilder modelBuilder)中删除modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();,并添加以下Fluent API配置,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<ExecutionResult>().HasRequired(er => er.SendedAnswer)
.WithMany(sa => sa.ExecutionResults).HasForeignKey(er => er.SendedAnswerId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<ExecutionResult>().HasRequired(er => er.Answer)
.WithMany().HasForeignKey(er => er.AnswerId).WillCascadeOnDelete(false);
}

现在再次生成迁移并更新数据库。

最新更新