【问题标题】:Cascade delete on one to many relation with same entity级联删除与同一实体的一对多关系
【发布时间】:2018-04-06 15:24:11
【问题描述】:

我有一个评论实体,其中一条新评论没有父评论,但有一个回复列表,这也是一个带有必需父评论的评论。

用户可以创建评论,然后其他用户可以回复该评论,该评论将成为所有这些回复的父级,并且回复还可以对每个回复进行进一步的回复,并带有父级评论。

如何级联删除每个评论的回复,以便在我删除评论或对该评论的回复时自动删除所有回复及其进一步回复。

这是评论模型:

public class Comment
{
    public Comment()
    {
        Replies = new List<Comment>();
    }
    [Required]
    public int CommentId { get; set; }

    public ApplicationUser User { get; set; }
    [Required]
    public DateTime Datetime { get; set; }      
    [Required]
    public string Audio { get; set; }

    public Post Post { get; set; }

    [JsonIgnore]
    public List<Comment> Replies { get; set; }

    public Comment Parent { get; set; }
}

这是我使用 Fluent API 尝试的方法

modelBuilder.Entity<Comment>().
            HasMany(s => s.Replies).
            WithRequired(s => s.Parent).
            WillCascadeOnDelete(true);

它会引发以下错误

引入 FOREIGN KEY 约束 表“评论”上的“FK_dbo.Comments_dbo.Comments_Parent_CommentId” 可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。无法创建约束或索引。见上 错误。

【问题讨论】:

  • 我认为您不能使用所需的父级进行级联删除。尝试将其指定为可选。
  • 仍然不工作 modelBuilder.Entity()。 HasMany(s => s.Replies)。 WithOptional(s => s.Parent)。 WillCascadeOnDelete(true);
  • 好吧,那您可能需要手动删除级联删除和删除回复。

标签: c# entity-framework ef-fluent-api


【解决方案1】:

您必须更改为 SQL 表,例如

ALTER TABLE 注释添加约束 FK_dbo.Comments_dbo.Comments_Parent_CommentId FOREIGN KEY (CommentId) REFERENCES T1 (CommentId)
ON DELETE CASCADE;

最后一个粗体部分是关键。

【讨论】:

  • 如何使用 Fluent API 做到这一点?
猜你喜欢
  • 1970-01-01
  • 2013-11-06
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 2020-07-27
  • 1970-01-01
  • 2018-04-26
相关资源
最近更新 更多