簡體   English   中英

桌面上的FK可能會導致多個循環或多個級聯路徑

[英]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; }
}

發送答案時,我的系統檢查答案是否與輸出有關

ExecutionResultID存儲到SendedAnswerAnswer (我添加了AnswerId並且在使用該ID添加新的遷移之后,下面顯示的錯誤顯示在update-database輸出中)。 在后面的代碼中,我正在檢查SendedAnswer和與Question相關的AnswersSendedAnswer被發送來解決一個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來AnswerSendedAnswer

如何將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM