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

问题描述:

我有每个类型继承表DB模式。 例如,实体是A,B,C,A1,A2。 基数 - A 派生 - A1,A2。 另 - B,C. 所以,A具有1至1关联A1和A2。 B和C分别与A1和A2具有关联(1到多个,DB侧有OnDelete动作)。级联删除在实体框架(每个类型继承表)

问题

我想的B删除记录,因此,我希望EF也删除其关联到当前B的记录的所有A1的对象。

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

为什么?如何修复它?

+0

有什么建议吗?我认为这是一个微不足道的问题。 – Developex 2012-01-30 13:45:28

这是一个众所周知的问题,我会说它是一个错误。显然,只从表A1中删除派生实体属性的记录是不正确的。数据库中的其余数据(在表A中)确实表示另一种对象类型。换句话说:这DELETE实际上并没有删除实体,但它改变了实体的类型=转化A1类型的对象为A类型的对象 - 这使得如果A是一个抽象的实体甚至更少的意义。

here建议的解决方法(据我所知)是丑陋:

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固定的孤立记录的问题。不幸的是,您不得不从数据库加载孩子以正确删除父母。

以下是有关这个问题的另一种自问自答:Problems using TPT (Table Per Type) in EF 4.2 and deletion of parent objects

+0

谢谢! mictosoft团队知道这个bug吗? :)你知道什么时候它会被修复吗?因为这种方法非常难看。但它的工作:) – Developex 2012-01-31 07:59:22

+0

@ user861108:不,我不知道是否或何时将被修复。我甚至不知道MS是否认为这个问题是一个错误。 – Slauma 2012-01-31 11:46:20

+0

我认为在这些情况下,如果使用其他类型的继承,则全部都可以。我使用表类型继承。也许如果我将使用Table Per Hierarchy,这个问题就不会出现。你怎么看 ? – Developex 2012-01-31 14:49:36

我有同样的问题,一个同事告诉我在做删除(O)之前遍历项目的集合,突然它的所有工作。