首页 文章

外键可能导致循环或多个级联路径

提问于
浏览
2

我试图创建一个(在我看来)非常简单的设置,但我无法弄清楚为什么我在运行 Update-Database 时不断收到此错误:

在表'Breweries'上引入FOREIGN KEY约束'FK_dbo.Breweries_dbo.Pages_PageId'可能会导致循环或多个级联路径 . 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束 .

我正在尝试设置此结构:

Brewery > Page > IdentityUser

这是我的课程:

public class Brewery
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public Guid BreweryId { get; set; }

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

    [Required]
    [ForeignKey("Page")]
    public Guid PageId { get; set; }

    public virtual Page Page { get; set; }

    public virtual ICollection<Image> Images { get; set; }
}

public class Page
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public Guid PageId { get; set;}
    [Required]
    public string Title { get; set; }

    public string Content { get; set; }
    [Required]
    [ForeignKey("CreatorUser")]
    public string CreatorUserId { get; set; }

    public virtual IdentityUser CreatorUser { get; set; }
}

我已经看过很多其他的Stack Overflow帖子,看起来我应该在_961644中设置一些内容,但我无法做到 . 我想避免在 Page 上有 ICollection<Brewery> Breweries 属性,因为我想要许多不同的实体来引用 Page 实体,并且它与引用它的 Page 无关 .

我是Entity Framework和Code First的新手,所以我可能在不知情的情况下接近了这个错误 . 我将不胜感激任何设置正确关系的帮助 .

1 回答

  • 0

    由于需要 PageBrewery 之间的关联,因此EF默认为级联删除 . 但是如果有很多实体引用 Page ,则会有多个级联路径,您必须覆盖默认值:

    modelBuilder.Entity<Brewery>()
                .HasRequired(b => b.Page)
                .WithMany() // <= no inverse collection in Page.
                .HasForeignKey(b => b.PageId)
                .WillCascadeOnDelete(false);
    

    您只能通过流畅的映射来完成此操作 . 此外,这将替换 Brewery.PageId 上的属性 .

相关问题