我正在创建一个看起来像这样的数据库:我有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
,下面显示的错误显示在update-database
的输出中使用此ID添加了新的迁移)。在后面的代码中,我正在检查SendedAnswer
和与Answers
相关的Question
(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
后,出现此错误:
在表'ExecutionResults'上引入FOREIGN KEY约束'FK_dbo.ExecutionResults_dbo.Answers_AnswerId'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。 无法创建约束或索引。查看以前的错误。
当我将此行添加到DbContext
中时(采用覆盖方法):
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
我收到错误消息,说我的IdentityUsers
缺少一对IDs
等(我的DbContext继承自IdentityDbContext<User>
)。
我的问题是,如何处理此错误?当我在删除路径上获得多个级联时?对我来说,这看起来还不错,因为删除Answer
之后我想删除ExecutionResult
,而且很明显我需要在ExecutionResult
到Answer
和SendedAnswer
中添加FK。
如何将Answers
表与ExecutionResult
表匹配而没有该错误?我在这里做错了什么?
答案 0 :(得分:0)
在外键约束上添加keys = ['a', 'b', 'c']
values = [123, 456, 789]
build_src = zip(keys, values)
build_list = {key: val for key, val in build_src}
属性以强制级联删除。
或者,根据您的需要,使用实体框架的fluent api定义其他OnDelete行为。 (https://www.learnentityframeworkcore.com/configuration/fluent-api/ondelete-method)
答案 1 :(得分:0)
从modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
中删除OnModelCreating(DbModelBuilder modelBuilder)
,并添加以下 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);
}
现在再次生成迁移并更新数据库。