我有每个类型继承的表的数据库模型。 例如,实体是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
中删除为什么呢?如何解决?
答案 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)之前迭代收集的项目,突然之间一切正常。