ASP.NET 5(MVC6)EF7外鍵可能會導致循環

asp.net asp.net-core-mvc entity-framework-core

這是我的模特:

public class Post
{

    [Key]
    public int PostId { get; set; }

    [Required]
    [MaxLength(140)]
    public string Title { get; set; }

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

    public ApplicationUser ApplicationUser { get; set; }
    public ICollection<Comment> Comments { get; set; }
}

public class Comment
{
    [Key]
    public int CommentId { get; set; }

    [Required]
    [StringLength(1000)]
    public string Text { get; set; }

    [Required]
    public int PostId { get; set; }

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


    public Post Post { get; set; }
    public ApplicationUser ApplicationUser { get; set; }

}

我收到錯誤:

在表'Comment'上引入FOREIGN KEY約束'FK_Comment_Post_PostId'可能會導致循環或多個級​​聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。無法創建約束或索引。查看以前的錯誤。

這正是它們在文檔中的演示方式。

現在,如果我刪除:

[Required]
public int PostId { get; set; }

並使用Fluent API如下:

builder.Entity<Comment>().HasOne(p => p.Post).WithMany(c => c.Comments).IsRequired();

我仍然得到同樣的錯誤。如果我明確說明

builder.Entity<Comment>().HasOne(p => p.Post).WithMany(c => c.Comments).IsRequired().OnDelete(DeleteBehavior.Cascade);

我仍然得到同樣的錯誤。

如果我使用以下內容:

builder.Entity<Comment>().HasOne(p => p.Post).WithMany(c => c.Comments);

可以在沒有帖子的情況下輸入評論。評論必須屬於帖子。

我錯過了什麼嗎?這是一個常見的用例,與PK所需的FK的1對多關係。

一般承認的答案

我確實錯過了一些東西。我的結構是用戶可以擁有帖子。帖子可以有評論。由於評論也有用戶,這就是造成循環問題的原因。

刪除帖子後,它會級聯刪除評論。這就是我們想要的。

當用戶被刪除時,它會將刪除級聯到帖子和評論。但是帖子也會嘗試級聯刪除評論。

我使用的解決方案是刪除從User到Comment的級聯刪除。

這可以通過以下方式完成:

builder.Entity<Comment>().HasOne(c => c.ApplicationUser).WithMany(u => u.Comments).IsRequired().OnDelete(DeleteBehavior.Restrict);


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因