[asp.net-mvc]适当的级联删除

发布时间: 2017/3/25 13:40:06
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

有 3 个实体︰

  • 用户
  • 事件
  • 审查。

用户ICollection<Event>ICollection<Review>

事件具有虚拟用户导航属性,和ICollection<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; }

而我 — — 引入外键可能会导致循环或级联的多个路径。不指定在删除任何行动或对更新没有行动,或修改其他的外键约束。无法创建约束。请参阅以前的错误。

我可以通过添加这对解决它 ModelCreating 的方法 DbContext :

        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:

你应该决定之间不能够删除或插入空值的外键的地方,当你删除,你可以让 User 来删除和插入 null 为任何删除 Event 那是外的键在 Review 和有孤立 Review ,这里是制作的代码 EventReview 可以为 null 的关系︰

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 自己,EF 并不为你做这个,就像吹示例︰

var eventItems = _db.Events.Include(p => p.Reviews).(s => s.UserIdfk == UserId);

                foreach (var item in eventItems)
                {
                    _db.Events.Remove(item);
                }

我希望我已经能够传达的一般做法。

官方微信
官方QQ群
31647020