1

我一直在做一个项目,我正在尝试启动级联删除。我在下面有一个模型用于评论。这些评论可以有来自他们调用评论类的回复。我想要做的是让它删除所有可以从评论中流出的回复。

评论 -> 回复 -> 回复 -> 回复 -> 以此类推。

如果我在错误的方向上进行此操作,请告诉我。我曾尝试对此进行研究,但我想出的只是一对一和一对多级联代码。我使用 CodeFirst 和 MVC 4 来构建我的项目。

已编辑

public class Comment
    {
        // Properties
        public long Id { get; set; }

        [Required]
        [StringLength(250, ErrorMessage = "{0} must be between {1} and {2} characters", MinimumLength = 2)]
        public string Body { get; set; }

        [Required]
        public DateTime CreateDate { get; set; }

        [Required]
        [InverseProperty("Comments")]
        public User Author { get; set; }

        [InverseProperty("CommentCount")]
        public Blog Blog { get; set; }

        public bool Hidden { get; set; }

        public long RepliesId { get; set; }

        [InverseProperty("Replies")]
        public virtual Comment Comments { get; set; }

        [InverseProperty("Comments")]
        public virtual ICollection<Comment> Replies { get; set; }

        public virtual ICollection<Vote> Votes { get; set; }

        public Comment()
        {
            CreateDate = DateTime.UtcNow;
            Hidden = false;
        }
    }

这是我的 DataContextInitializer

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Comment>().HasMany(i => i.Replies)
            .WithOptional(i => i.Comments)
            .HasForeignKey(i => i.RepliesId)
            .WillCascadeOnDelete();
    }
4

1 回答 1

2

您可以使用这样的方式启用级联删除(即您需要手动设置关系)...

modelBuilder.Entity<Comment>()
    .HasOptional(x => x.Replies)
    .WithOptionalDependent()
    .WillCascadeOnDelete(true);

但是,它不会对你有多大好处 - 因为Update-Database会失败,比如......

不允许使用具有 UPDATE 或 DELETE CASCADE 规则并自引用同一表中的列的外键约束。

即适用于连接不同表的 FK-s -但不适用于 ifself-referencing

看到这篇文章有一些更相关的信息 - 尤其是提到的评论

“您需要删除 FK 并在 DatabaseInitializer 中使用级联删除手动创建它”

EF4 代码优先 - 从数据库中删除父级时删除所有子级?

简而言之,我认为没有直接的解决方案 - 但需要一些手动设置(初始化程序等)(我没有尝试过)。或者尝试重新组织,稍微扁平化关系(我没有想太多,只是在这里抛出一些非常通用的方法)。


仅供参考-即使我认为它不会带您到任何地方(见上文)...

public class Comment
{
    // Properties
    public long Id { get; set; }

    //[Required]
    //[StringLength(250, ErrorMessage = "{0} must be between {1} and {2} characters", MinimumLength = 2)]
    public string Body { get; set; }

    [Required]
    public DateTime CreateDate { get; set; }

    // [Required]
    // [InverseProperty("Comments")]
    public MyUser Author { get; set; }

    // [InverseProperty("CommentCount")]
    public Blog Blog { get; set; }

    public bool Hidden { get; set; }

    public virtual ICollection<Comment> Replies { get; set; }
    public virtual ICollection<Vote> Votes { get; set; }

    public Comment()
    {
        CreateDate = DateTime.UtcNow;
        Hidden = false;
    }
}

modelBuilder.Entity<Comment>()
    .HasOptional(x => x.Replies)
    .WithOptionalDependent()
    .WillCascadeOnDelete(true);

如果您让它“不级联”,这应该可以正常工作。否则失败。

于 2013-04-02T20:03:50.963 回答