实体框架中的级联删除(每个类型的表继承)

本文关键字:类型 继承 框架 级联 删除 实体 | 更新日期: 2023-09-27 18:21:48

我有一个DB模型,它具有按类型继承的表。例如,实体是A、B、C、A1、A2。底座-A衍生-A1、A2。另一个-B,C。因此,A与A1和A2有1比1的关联。B和C分别与A1和A2有关联(1对多,在DB侧有OnDelete操作)。

问题

我试图从B中删除记录,所以我希望EF也删除与当前B的记录相关联的所有A1对象。

最后,EF从B中删除记录,从A1中删除所有相关记录,但不从中删除

为什么?如何修复?

实体框架中的级联删除(每个类型的表继承)

这是一个已知的问题,我称之为bug。显然,仅从表A1中删除派生实体属性的记录是不正确的。数据库中的其余数据(在表A中)确实表示另一种对象类型。换句话说:这个DELETE实际上并没有删除实体,但它改变了实体的类型=将A1类型的对象转换为A类型的对象-如果A是抽象实体,这就没有什么意义了。

这里推荐的解决方法(据我所知)很难看:

var b = context.Bs.Include("A1s").Single(b => b.Id == 1);
foreach (var a1 in b.A1s.ToList())
    context.As.Remove(a1);
context.Bs.Remove(b);
context.SaveChanges();

context.As.Remove(a1);应该从AA1表中删除,从而解决A表中孤立记录的问题。不幸的是,您被迫从数据库中加载子项以正确删除父项。

下面是关于这个问题的另一个问答:在EF 4.2中使用TPT(每种类型的表)和删除父对象的问题

我遇到了同样的问题,一位同事告诉我在执行Remove(o)之前迭代项目集合,突然一切都成功了。