/// <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); } }
/// <summary> Cascade to the collection elements</summary> private async Task CascadeCollectionElementsAsync(object parent, object child, CollectionType collectionType, CascadeStyle style, IType elemType, object anything, bool isCascadeDeleteEnabled, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); bool reallyDoCascade = style.ReallyDoCascade(action) && child != CollectionType.UnfetchedCollection; if (reallyDoCascade) { log.Info("cascade " + action + " for collection: " + collectionType.Role); foreach (object o in action.GetCascadableChildrenIterator(eventSource, collectionType, child)) { await(CascadePropertyAsync(parent, o, elemType, style, null, anything, isCascadeDeleteEnabled, cancellationToken)).ConfigureAwait(false); } log.Info("done cascade " + action + " for collection: " + 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: " + 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); await(DeleteOrphansAsync(entityName, childAsPersColl, cancellationToken)).ConfigureAwait(false); log.Info("done deleting orphans for collection: " + collectionType.Role); } }