例外:外键约束可能导致多个循环

本文关键字:循环 约束 例外 | 更新日期: 2023-09-27 18:09:04

我是ASP .NET的新手。我试图做简单的CRUD使用以下模型。在Paper类中有三个ChartOfAccountId,所以有三个亲子关系。这些关系之一ChartOfAccountIdInventory导致以下异常:

Introducing FOREIGN KEY constraint FK_dbo.Papers_dbo.ChartOfAccounts_ChartOfAccountIdInventory' on table 'Papers' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint.

ChartOfAccount类:

public partial class ChartOfAccount
{
    public ChartOfAccount()
    {
        this.PapersSale = new HashSet<Paper>();
        this.PapersCostOfSale = new HashSet<Paper>();
        this.PapersInventory = new HashSet<Paper>();
    }
    [StringLength(50)]
    [ScaffoldColumn(true)]
    public string Id { get; set; }
    [StringLength(50)]
    public string Name { get; set; }
    public virtual ICollection<Paper> PapersSale { get; set; }
    public virtual ICollection<Paper> PapersCostOfSale { get; set; }
    public virtual ICollection<Paper> PapersInventory { get; set; }
}

纸类:

    public class Paper
    {
        [Key]
        [ScaffoldColumn(false)]
        public int Id { get; set; }
        [DisplayName("Name")]
        [Required(ErrorMessage = "Name is required")]
        [StringLength(50)]
        public string Name { get; set; }
        [DisplayName("Chart Of Account For Sale")]
        [Required(ErrorMessage = "Chart Of Account is required")]
        [StringLength(50)]
        public string ChartOfAccountIdSale { get; set; }
        [DisplayName("Chart Of Account For Inventory")]
        [Required(ErrorMessage = "Chart Of Account is required")]
        [StringLength(50)]
        public string ChartOfAccountIdInventory { get; set; }
        [DisplayName("Chart Of Account For Cost Of Sale")]
        [Required(ErrorMessage = "Chart Of Account is required")]
        [StringLength(50)]
        public string ChartOfAccountIdCostOfSale { get; set; }
        [ForeignKey("ChartOfAccountIdSale")]
        public virtual ChartOfAccount ChartOfAccountSale { get; set; }
        [ForeignKey("ChartOfAccountIdInventory")]
        public virtual ChartOfAccount ChartOfAccountInventory { get; set; }
        [ForeignKey("ChartOfAccountIdCostOfSale")]
        public virtual ChartOfAccount ChartOfAccountCostOfSale { get; set; }
   }    

例外:外键约束可能导致多个循环

你应该设置"WillCascadeOnDelete = False"由fluentApi,像这样:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
         modelBuilder.Entity<Paper>()
            .HasRequired(c => c.ChartOfAccountSale )
            //.WithMany()
            .HasForeignKey(c => c.ChartOfAccountIdSale)
            .WillCascadeOnDelete(false);
         modelBuilder.Entity<Paper>()
            .HasRequired(c => c.ChartOfAccountInventory )
            //.WithMany()
            .HasForeignKey(c => c.ChartOfAccountIdInventory )
            .WillCascadeOnDelete(false);
         modelBuilder.Entity<Paper>()
            .HasRequired(c => c.ChartOfAccountCostOfSale )
            //.WithMany()
            .HasForeignKey(c => c.ChartOfAccountIdCostOfSale )
            .WillCascadeOnDelete(false);

}

我为所有chartOfAccounts使用了required标签,这就是为什么它会通过异常