实体框架 - 递归地包括所有相关实体

时间:2013-12-05 03:54:26

标签: c# entity-framework

假设我有以下实体/关系:

  • ParentOptionalChild 0:1
  • OptionalChildOptionalGrandchild 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的共同祖先,即:

  • CommonAncestorGuid ID
  • ParentOptionalChildOptionalGrandchild都来自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);

0 个答案:

没有答案