美文网首页
EFCore级联删除

EFCore级联删除

作者: AlexWillBeGood | 来源:发表于2020-09-11 16:17 被阅读0次

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

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

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

  • 1:1 Order:OrderInfo
  • 1:N Order:OrderDetail
  • 1:N Order:Order
    这可能并非是一个真实的场景,特别是Order后面还会关联一个Order形成一个树形结构。再次只是为了测试说明。
    迁移并且Update到数据库的时候后发现Order使用PreviousOrderId作为外键关联到本身并非级联删除。
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

相关文章

  • EFCore级联删除

    可以利用级联删除去掉一条记录相关的所有记录,就不需要一个个去删除关联表记录。之所以注意到这个是因为现在项目中的业务...

  • 级联删除

    实现 级联删除(cascade delete)隶属于约束条件(constraint),因此,级联删除需要在约束条件...

  • iview踩坑

    1、iview三级联动,删除效果实现 需求:省市区的三级联动,并且有删除效果,执行删除时,后面的一项也需要删除;当...

  • 数据保存(四) 立即执行中删除

    1.级联删除子表 删除数据的同时,删除引用这条记录的子表的数据,可以通过在数据表设计中,对于引用字段,勾选上级联删...

  • EF Core级联删除的设定

    EF6和EF Core都支持级联删除。EF6要禁止级联删除是在数据库上下文的OnModelCreating方法中设...

  • hibernate级联删除

    hibernate级联删除,有三个实体类,一级分类(category),二级分类(categorySecond)文...

  • JPA-常用功能

    关于级联(级联删除) 我始终没研究清楚cascade=CascadeType.PERSIST之类的,有时间待补。级...

  • JAVA WEB开发笔记

    级联删除(ON DELETE CASCADEurl: jdbc:mysql://localhost:3306/my...

  • jpa 级联

    jpa级联 对应项里面似乎不用再做处理了 在做级联删除的时候应该@onetomany里面的orphanRemova...

  • Finalizers

    前言 Kubernetes 中的对象删除并不像表面上看起来那么简单,删除对象涉及一系列过程,例如对象的级联和非级联...

网友评论

      本文标题:EFCore级联删除

      本文链接:https://www.haomeiwen.com/subject/flcbektx.html