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

本文关键字:级联 路径 循环 | 更新日期: 2023-09-27 18:27:25

我试图创建一个(在我看来)非常简单的设置,但我不明白为什么我在运行Update-Database:时一直会出现这个错误

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

我正在尝试设置这个结构:

Brewery>Page>IdentityUseratr

这是我的课程:

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的帖子,似乎我应该在OnModelCreating中设置一些东西,但我做不好。我希望避免在Page上有ICollection<Brewery> Breweries属性,因为我希望许多不同的实体引用Page实体,而它与引用它的Page无关。

我是实体框架和代码优先的新手,所以我可能在不知情的情况下错误地处理了这个问题。我将感谢任何帮助来建立正确的关系。

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

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

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

只有通过流畅的映射才能做到这一点。此外,这将替换Brewery.PageId上的属性。