Exemple #1
0
        /// <summary> Cascade to the collection elements</summary>
        private void CascadeCollectionElements(object parent, object child, CollectionType collectionType, CascadeStyle style, IType elemType, object anything, bool isCascadeDeleteEnabled)
        {
            bool reallyDoCascade = style.ReallyDoCascade(action) &&
                                   child != CollectionType.UnfetchedCollection;

            if (reallyDoCascade)
            {
                log.Info("cascade {0} for collection: {1}", action, collectionType.Role);

                foreach (object o in action.GetCascadableChildrenIterator(eventSource, collectionType, child))
                {
                    CascadeProperty(parent, o, elemType, style, null, anything, isCascadeDeleteEnabled);
                }

                log.Info("done cascade {0} for collection: {1}", action, collectionType.Role);
            }

            var  childAsPersColl = child as IPersistentCollection;
            bool deleteOrphans   = style.HasOrphanDelete && action.DeleteOrphans && elemType.IsEntityType &&
                                   childAsPersColl != null;              //a newly instantiated collection can't have orphans

            if (deleteOrphans)
            {
                // handle orphaned entities!!
                log.Info("deleting orphans for collection: {0}", collectionType.Role);

                // we can do the cast since orphan-delete does not apply to:
                // 1. newly instantiated collections
                // 2. arrays (we can't track orphans for detached arrays)
                string entityName = collectionType.GetAssociatedEntityName(eventSource.Factory);
                DeleteOrphans(entityName, childAsPersColl);

                log.Info("done deleting orphans for collection: {0}", collectionType.Role);
            }
        }