[英]FK on table may cause multiple cycles or multple cascade paths
我正在創建一個看起來像這樣的數據庫:我有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
和與Question
相關的Answers
( 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; }
}
在使用新列添加遷移以在ExecutionResult
類中存儲AnswerId
之后,出現以下錯誤:
在表'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
添加FK來Answer
和SendedAnswer
。
如何將Answers
表與ExecutionResult
表匹配而沒有該錯誤? 我在這里做錯了什么?
在外鍵約束上添加[Required]
屬性,以強制級聯刪除。 或者,根據您的需要,使用實體框架的fluent api定義其他OnDelete行為。 ( https://www.learnentityframeworkcore.com/configuration/fluent-api/ondelete-method )
刪除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);
}
現在,再次生成遷移並更新數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.