private void DeleteWithRefsRecursively(ObjectStateEntry entry, ObjectContext objectContext) { if (entry.State == EntityState.Deleted) { return; } var references = entry .RelationshipManager .GetAllRelatedEnds() .Where(re => re is IEnumerable) .Select(re => new { RelatedEnd = re, AssociationType = re.RelationshipSet.ElementType as AssociationType }) .Where(x => x.AssociationType?.IsForeignKey == true) .ToList(); foreach (var reference in references) { reference.RelatedEnd.Load(); if (reference.AssociationType.Constraint.FromRole.DeleteBehavior == OperationAction.Cascade) { foreach (var obj in ((IEnumerable)reference.RelatedEnd).Cast <object>().ToList()) { var depEntry = objectContext.ObjectStateManager.GetObjectStateEntry(obj); DeleteWithRefsRecursively(depEntry, objectContext); } } } entry.Delete(); }