首页 文章

正确的级联删除

提问于
浏览
1

有3个实体:

  • 用户

  • 事件

  • 评论 .

UserICollection<Event>ICollection<Review> .

Event 具有虚拟用户导航属性, ICollection<Review>

Review 类的结构

public int Id { get; set; }

    public string Text { get; set; }

    public int Mark { get; set; }

    public ReviewStatus ReviewStatus { get; set; }

    public int EventId { get; set; }
    public virtual Event Event { get; set; }

    public int UserId { get; set; }
    public virtual AppUser User { get; set; }

我得到了 - 引入FOREIGN KEY可能会导致循环或多个级联路径 . 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束 . 无法创建约束 . 查看以前的错误 .

我可以通过在 DbContextModelCreating 方法上添加它来解决它:

modelBuilder.Entity<Event>().
            HasMany(e => e.Reviews).
            WithRequired(e => e.Event).
            WillCascadeOnDelete(false);

        modelBuilder.Entity<AppUser>().
            HasMany(u => u.Reviews).
            WithRequired(r => r.User).
            WillCascadeOnDelete(false);

但在此之后我无法从数据库中删除事件或用户,因为发生了外键错误 . 那还有另一种解决方案吗?

1 回答

  • 1

    您应该在删除时决定在外键的位置无法删除或插入null,您可以删除 User 并为 Review 中的任何已删除的 Event 插入null,并且有孤立的 Review ,这里是使 EventReview 关系成为可空的代码:

    modelBuilder.Entity<Review>()
               .HasOptional(t => t.Event)
               .WithMany(t => t.Reviews)
               .HasForeignKey(d => d.EventId)
               .WillCascadeOnDelete(false);
    
    
               modelBuilder.Entity<Review>()
                .HasOptional(p => p.Event)
                .WithMany(p => p.Reviews)
                .HasForeignKey(p => p.EventId);
    

    还记得懒惰加载 EventReviewInclude 删除用户,否则 null 将不会被插入,其他要点是当你面对这样的情况时 User 有很多 EventsEvents 有很多 Reviews 你必须这样做 EventReview 自己为null插入,EF不会为你做这件事,比如打击示例:

    var eventItems = _db.Events.Include(p => p.Reviews).(s => s.UserIdfk == UserId);
    
                    foreach (var item in eventItems)
                    {
                        _db.Events.Remove(item);
                    }
    

    我希望我能够传达一般方法 .

相关问题