假设我有以下实体/关系:
Parent
至OptionalChild
0:1 OptionalChild
至OptionalGrandchild
0:1 如果我想删除Parent
我还想删除其子女及其子女等等。
我目前实现这一目标的方式需要提前了解整个家属链:
myContext.OptionalChildren.Remove(myContext.OptionalChildren.Include(o => o.OptionalGrandchild).Single(o => o.Name.Equals("childName")));
myContext.Parents.Remove(myContext.Parents.Include(p => p.OptionalChild).Single(p => p.Name.Equals("parentName")));
我是否有某种方法可以告诉EF搜索树并为我执行此操作以便我可以执行以下操作:
myContext.Parents.Remove(myContext.Parents.IncludeRecursively().Single(p => p.Name.Equals("parentName")));
编辑:
我已经设置了级联删除,但由于某些原因他们没有采取(请参阅与问题密切相关的问题Multiplicity constraint violations with optional-required EF Code First + Fluent relationship?),除非我明确包含它们。我的类层次结构与链接问题中的层次结构相同,只不过这个具有孙子。
另外,如果它是相关的,我使用“每个类型的表”策略,其中我提到的所有三个对象都来自包含PK的共同祖先,即:
CommonAncestor
有Guid ID
Parent
,OptionalChild
和OptionalGrandchild
都来自CommonAncestor
流畅的配置如下:
builder.Entity<Parent>().HasOptional<OptionalChild>(p => p.OptionalChild).WithRequired(c => c.Parent).WillCascadeOnDelete(true);
builder.Entity<OptionalChild>().HasOptional<OptionalGrandchild>(c => c.OptionalGrandchild).WithRequired(g => g.OptionalChild).WillCascadeOnDelete(true);