【问题标题】:Foreign key may cause cycles or multiple cascade paths外键可能导致循环或多个级联路径
【发布时间】:2016-03-26 18:11:42
【问题描述】:

我正在尝试创建一个(在我看来)非常简单的设置,但我无法弄清楚为什么我在运行 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 帖子,似乎我应该在 OnModelCreating 中设置一些东西,但我做错了。我想避免在Page 上使用ICollection&lt;Brewery&gt; Breweries 属性,因为我希望许多不同的实体都引用Page 实体,这与引用它的Page 无关。

我是 Entity Framework 和 Code First 的新手,所以我可能在不知不觉中处理了这个错误。对于正确设置关系的任何帮助,我将不胜感激。

【问题讨论】:

    标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-5


    【解决方案1】:

    由于需要Page和Brewery之间的关联,EF默认为级联删除。但是如果有很多实体引用Page,就会有多个级联路径,你必须覆盖默认值:

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

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

    【讨论】:

    • 我仍然遇到同样的错误。还有其他建议吗? ://
    • 您应该查看引用 Page 的其他级联外键,或来自 Brewery 的其他引用。
    猜你喜欢
    • 2010-10-25
    • 2012-09-21
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多