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

时间:2012-01-30 13:00:43

标签: c# .net entity-framework

我有每个类型继承的表的数据库模型。 例如,实体是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中删除所有相关记录,但不从A

中删除

为什么呢?如何解决?

2 个答案:

答案 0 :(得分:7)

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

here推荐的解决方法(据我了解)很难看:

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);A表中删除,从而解决表A1中孤立记录的问题。不幸的是,您被迫从数据库中加载子项以正确删除父项。

以下是关于此问题的另一个问题和答案:Problems using TPT (Table Per Type) in EF 4.2 and deletion of parent objects

答案 1 :(得分:0)

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