簡體   English   中英

EF 外鍵約束

[英]EF Foreign Key constraint

我仍在研究實體框架並嘗試創建一個包含外鍵的 model。

但是當我嘗試遷移代碼時,出現了這個錯誤

在表“QuestionResults”上引入 FOREIGN KEY 約束“FK_dbo.QuestionResults_dbo.QuestionsTables_QuetionsTableId”可能會導致循環或多個級聯路徑。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束

這些是我的 model 課程:

public class MainDetails
{
    [Key]
    public int Id { get; set; }
    public string Language { get; set; }

    [Required]
    public string CustomerName { get; set; }

    [Required]
    public string ContactNumber { get; set; }
    public string EmailAddress { get; set; }

    [DisplayName("Service Type")]
    [ForeignKey("QuestionsTable")]
    public int ServiceTypeId { get; set; }
    public virtual QuestionsTable QuestionsTable { get; set; }

    [Required]
    public string VehicleNumber { get; set; }

    [Required]
    public string ServiceLocation { get; set; }
    public string Suggestion { get; set; }
    public bool Status { get; set; } = true;

    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    [Display(Name = "Created Date")]
    public DateTime CreatedDate { get; set; } = DateTime.Now;

    public virtual QuestionResults QuestionResults { get; set; }

    public virtual IList<QuestionResults> QuestionResultsMainlist { get; set; }
    public virtual IList<QuestionsTable> QuestionsTables { get; set; }
}

public class QuestionsTable
{
    [Key]
    public int Id { get; set; }
    public string ServiceType { get; set; }
    public string Question { get; set; }
    public virtual IList<MainDetails> MainDetailsServiceType { get; set; }
    public QuestionsTable()
    {
        MainDetailsServiceType = new List<MainDetails>();
    }
}

public class QuestionResults
{
    [Key]
    public int Id { get; set; }

    [DisplayName("MainDetail ID")]
    [ForeignKey("MainDetails")]
    public int MainDetailsId { get; set; }
    public virtual MainDetails MainDetails { get; set; }

    [DisplayName("MainDetail ID")]
    [ForeignKey("QuestionsTable")]
    public int QuetionsTableId { get; set; }
    public virtual QuestionsTable QuestionsTable { get; set; }

    [Required]
    public string CustoAnswer { get; set; }
}

這是我要創建的表結構:

在此處輸入圖像描述

要解決此問題,您可以使用 EF Model Builder

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{   
    modelBuilder.Entity<QuestionsTable>()
        .HasRequired(a => a.MainDetails)
        .WithOptionalDependent()
        .WillCascadeOnDelete(false); //This is the important row
}

您必須考慮您想要的關系類型以及是否明確指定外鍵。 如果您之前沒有見過這個 model 構建器,請閱讀此處: https://learn.microsoft.com/en-us/ef/core/modeling/


在分解您的場景后,我注意到了一些“奇怪之處”。 我將域 model 中的噪聲從您的示例降低到這個

public class MainDetails
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("QuestionsTable")]
    public int ServiceTypeId { get; set; }
    
    public virtual QuestionsTable QuestionsTable { get; set; }

    public virtual QuestionResults QuestionResults { get; set; }

    public virtual IList<QuestionResults> QuestionResultsMainlist { get; set; }
    
    public virtual IList<QuestionsTable> QuestionsTables { get; set; }
}

public class QuestionsTable
{
    [Key]
    public int Id { get; set; }
    public string ServiceType { get; set; }
    public string Question { get; set; }
    public virtual IList<MainDetails> MainDetailsServiceType { get; set; }
}

public class QuestionResults
{
    [Key]
    public int Id { get; set; }

    [ForeignKey("MainDetails")]
    public int MainDetailsId { get; set; }
    public virtual MainDetails MainDetails { get; set; }

    [ForeignKey("QuestionsTable")]
    public int QuetionsTableId { get; set; }
    public virtual QuestionsTable QuestionsTable { get; set; }
}

我注意到了一些事情。

  • MainDetails 包含一對多(QuestionTable)和多對多(IList)關系? 我不確定你的意圖
  • QuestionsResults 包含與未在 QuestionTable class 中復制的兩個實體的單一關系? 如果是故意的就好了
  • ServiceType 是 QuestionsTable 中的字符串,但您期望 int 作為 MainDetails 中的外鍵?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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