Asp.net mvc 在实体中级联删除实体

Asp.net mvc 在实体中级联删除实体,asp.net-mvc,entity-framework,database-design,ef-code-first,cascading-deletes,Asp.net Mvc,Entity Framework,Database Design,Ef Code First,Cascading Deletes,我一直在做一个项目,我正试图让级联删除生效。我在下面有一个模型供我评论。这些注释可以包含来自调用comment类的注释的回复。我想做的是让它删除评论中所有的回复 评论->回复->回复->回复->等等 如果我走错了方向,请告诉我。我曾尝试研究过这个问题,但我所想到的只是一对一和一对多的级联代码。我正在使用CodeFirst和MVC4构建我的项目 已编辑 public class Comment { // Properties public long Id {

我一直在做一个项目,我正试图让级联删除生效。我在下面有一个模型供我评论。这些注释可以包含来自调用comment类的注释的回复。我想做的是让它删除评论中所有的回复

评论->回复->回复->回复->等等

如果我走错了方向,请告诉我。我曾尝试研究过这个问题,但我所想到的只是一对一和一对多的级联代码。我正在使用CodeFirst和MVC4构建我的项目

已编辑

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;
        }
    }
公共类注释
{
//性质
公共长Id{get;set;}
[必需]
[StringLength(250,ErrorMessage=“{0}必须介于{1}和{2}个字符之间”,MinimumLength=2)]
公共字符串体{get;set;}
[必需]
公共日期时间CreateDate{get;set;}
[必需]
[反向属性(“评论”)]
公共用户作者{get;set;}
[反向属性(“注释计数”)]
公共博客Blog{get;set;}
公共布尔隐藏{get;set;}
公共长应答ID{get;set;}
[反向属性(“回复”)]
公共虚拟注释{get;set;}
[反向属性(“评论”)]
公共虚拟ICollection回复{get;set;}
公共虚拟ICollection投票{get;set;}
公众评论()
{
CreateDate=DateTime.UtcNow;
隐藏=错误;
}
}
这是我的DataContextInitializer

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Comment>().HasMany(i => i.Replies)
            .WithOptional(i => i.Comments)
            .HasForeignKey(i => i.RepliesId)
            .WillCascadeOnDelete();
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().HasMany(i=>i.repress)
.WithOptional(i=>i.Comments)
.HasForeignKey(i=>i.RepliesId)
.WillCascadeOnDelete();
}

您可以使用类似的方法启用级联删除(即,您需要手动设置关系)


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

我想我差不多成功了。我得到一个\tSystem.Data.Entity.Edm.EdmAssociationType::多重性与关系“Comment\u Replies”中角色“Comment\u Replies\u Source”中的引用约束冲突。因为从属角色中的所有属性都不可为null,所以主体角色的多重性必须为“1”。错误我认为您可以删除“反向”,因为它应该得到正确的w/o它(和+必需)。但这仍然是“徒劳的”尝试——除非你重新组织它(我可以在代码中编辑,直到出现错误)。我仍然收到相同的错误。我认为这可能是因为回复是一个可为空的实体。由于它是一个可选字段,因此该部分可能会失败。我不确定。是的,只要我没有级联删除,第一个答案就行。我试图完成的是在我需要删除一个用户的情况下。它将级联并删除所有there注释和所有there子注释。好吧,正如我告诉过你的那样——这是一个“禁止”的做法——如果你愿意,你可以尝试建议的解决方法(初始值设定项)。另一方面,删除并不是那么频繁,所以你可以“标记”它们,然后卸载它们进行一些清理。我知道这是一种痛苦,但我认为这是最好的,因为它得到不幸。
modelBuilder.Entity<Comment>()
    .HasOptional(x => x.Replies)
    .WithOptionalDependent()
    .WillCascadeOnDelete(true);
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);