可以利用级联删除去掉一条记录相关的所有记录,就不需要一个个去删除关联表记录。之所以注意到这个是因为现在项目中的业务场景用到树形结构存储,一层层删除太麻烦。
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作为外键关联到本身并非级联删除。

而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指定了外键,就会生成两个外键。
再次迁移时候变成级联删除。

网友评论