我正在创建一个如下所示的数据库:我有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
的输出)。在后面的代码中,我使用与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‘上引入外键约束ExecutionResults可能会导致循环或多个级联路径。指定“删除不操作”或“更新不操作”,或修改其他外键约束。无法创建约束或索引。请参阅先前的错误。
当我将这一行添加到我的DbContext
(在重写的方法中)时:
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
我得到了错误,我的IdentityUsers
缺少一对IDs
等等(我的DbContext继承了IdentityDbContext<User>
)。
我的问题是,如何处理这个错误?当我在删除路径上得到多个级联时?对我来说,它看起来很好,因为在删除Answer
之后,我想删除ExecutionResult
,而且很明显,我需要在ExecutionResult
中的FK到Answer
和SendedAnswer
。
如何在没有此错误的情况下将Answers
表与ExecutionResult
表匹配?我在这里做错了什么?
发布于 2019-04-26 07:36:17
在外键约束上添加[Required]
属性以强制级联删除。或者,使用实体框架fluent api根据您的需要定义其他一些OnDelete行为。(https://www.learnentityframeworkcore.com/configuration/fluent-api/ondelete-method)
发布于 2019-04-26 09:48:36
从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);
}
现在再次生成迁移并更新数据库。
https://stackoverflow.com/questions/55862297
复制相似问题