级联删除在实体框架(每个类型继承表)
问题描述:
我有每个类型继承表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和所有相关记录的记录,但不能从
为什么?如何修复它?
答
这是一个众所周知的问题,我会说它是一个错误。显然,只从表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);
应该从两个A
和A1
表中删除,从而在表A
固定的孤立记录的问题。不幸的是,您不得不从数据库加载孩子以正确删除父母。
以下是有关这个问题的另一种自问自答:Problems using TPT (Table Per Type) in EF 4.2 and deletion of parent objects
答
我有同样的问题,一个同事告诉我在做删除(O)之前遍历项目的集合,突然它的所有工作。
有什么建议吗?我认为这是一个微不足道的问题。 – Developex 2012-01-30 13:45:28