Exemplo n.º 1
0
        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();
        }