我试图创建一个(在我看来)非常简单的设置,但是我不知道为什么在运行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
中进行设置,但是我做错了。我想避免在ICollection<Brewery> Breweries
上具有Page
属性,因为我希望许多不同的实体引用Page
实体,并且与Page
引用它无关。我是Entity Framework和Code First的新手,所以我可能不知不觉地遇到了这个错误。我会很高兴对建立正确的关系有所帮助。
最佳答案
由于需要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
上的属性。