entity framework中的级联删除(每个类型inheritance的表)

我有DB模型与每种类型的表inheritance。 例如,实体是A,B,C,A1,A2。 Base – A Derived – A1,A2。 另一个 – B,C。因此,A与A1和A2具有1对1的关联。 B和C分别与A1和A2有关联(1到多个,在DB侧有OnDelete动作)。

问题

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

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

为什么? 如何解决?

这是一个已知问题,我称之为bug。 显然,仅从表A1删除派生实体属性的记录是不正确的。 数据库中的其余数据(表A )确实代表另一种对象类型。 换句话说:这个DELETE实际上并没有删除一个实体,但是它改变了实体的类型=将类型为A1的对象转换为类型A1的对象 – 如果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(每种类型的表)和删除父对象的问题

我遇到了同样的问题,一位同事告诉我在进行删除(o)之前迭代项目集合,突然之间一切正常。