我正在创建一个看起来像这样的数据库: 我有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
存储ID
SendedAnswer
和Answer
(我添加了AnswerId
,下面显示的错误显示在使用此ID添加新迁移后的update-database
输出中)。在我的代码隐藏中,我正在检查与Question
相关的Answers
SendedAnswer
(发送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
才能Answer
和SendedAnswer
。
如何在没有该错误的情况下将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);
}
现在再次生成迁移并更新数据库。