EFCore级联删除

2020-09-11  本文已影响0人  AlexWillBeGood

可以利用级联删除去掉一条记录相关的所有记录,就不需要一个个去删除关联表记录。之所以注意到这个是因为现在项目中的业务场景用到树形结构存储,一层层删除太麻烦。

public class Order
    {
        public Order()
        {
            this.OrderDetails = new List<OrderDetail>();
        }
        public int Id { get; set; }
        public int? PreviousOrderId { get; set; }
        public virtual ICollection<OrderDetail> OrderDetails { get; set; }
        public virtual OrderInfo OrderInfo { get; set; }
        public virtual ICollection<Order> NextOrders{get;set;}
        public virtual Order PreviousOrder { get; set; }
    }
    public class OrderDetail
    {
        public int Id { get; set; }
        public int OrderId { get; set; }
        public virtual Order Order { get; set; }
    }
    public class OrderInfo
    {
        public int Id { get; set; }
        public int OrderId { get; set; }
        public virtual Order Order { get; set; }
    }

这个例子里面只留下了主键和外键属性,简单关系就是:

image.png

而Order关联OrderInfo,OrderDetail都为级联删除。
这样会导致删除Order记录时报错。

Cannot delete or update a parent row: a foreign key constraint fails

不知道使用Annotation方式去解决,我还是使用了FluentApi去告知为级联删除。

modelBuilder.Entity<Order>(e=> {
                e.ToTable("order");
                e.HasData(orders);
                e.HasMany(e => e.NextOrders).WithOne(e => e.PreviousOrder).HasForeignKey(e => e.PreviousOrderId).IsRequired(false).OnDelete(DeleteBehavior.Cascade);
            });

这里需要注意,如果WithOne没有指定实体而又HasForeignKey指定了外键,就会生成两个外键。
再次迁移时候变成级联删除。


image.png
上一篇 下一篇

猜你喜欢

热点阅读