级联删除实体内的实体

时间:2013-04-02 11:24:32

标签: asp.net-mvc entity-framework database-design ef-code-first cascading-deletes

我一直在研究一个项目,我正试图让级联删除开始。我有一个模型,我用它来评论。这些注释可以包含调用注释类的回复。我要做的是让它删除所有可以从评论中流出的回复。

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

如果我朝错误的方向走,请告诉我。我试图对此进行研究,但我想出的只是一对一和一对多级联代码。我正在使用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();
    }

1 个答案:

答案 0 :(得分:2)

你可以用这样的东西启用级联删除(即你需要手动设置关系)......

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

然而,它对你没有多大帮助 - 因为Update-Database会失败... ...

  

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

即。适用于连接不同表格的FK-s - 但不适用于self-referencing

请参阅此帖子以及更多相关信息 - 尤其是提及的评论

  

“您需要删除FK并使用级联删除手动创建它   你的DatabaseInitializer“

EF4 Code first - delete all children when deleting parent from db?

简而言之,我认为没有直接的解决方案 - 但需要一些手动设置(初始化程序等)(我还没试过)。或者尝试重新组织,平衡关系(我没有想太多,只是抛出一些相当普遍的方法)。

<小时/> 仅供参考 - 即使我认为它不会让你到任何地方(见上文)......

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);

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