Example #1
0
        /// <inheritdoc />
        public virtual async Task RemoveFromToManyRelationshipAsync(TResource primaryResource, ISet <IIdentifiable> secondaryResourceIds,
                                                                    CancellationToken cancellationToken)
        {
            _traceWriter.LogMethodStart(new
            {
                primaryResource,
                secondaryResourceIds
            });

            ArgumentGuard.NotNull(secondaryResourceIds, nameof(secondaryResourceIds));

            var relationship = (HasManyAttribute)_targetedFields.Relationships.Single();

            await _resourceDefinitionAccessor.OnRemoveFromRelationshipAsync(primaryResource, relationship, secondaryResourceIds, cancellationToken);

            if (secondaryResourceIds.Any())
            {
                object rightValue = relationship.GetValue(primaryResource);

                HashSet <IIdentifiable> rightResourceIds = _collectionConverter.ExtractResources(rightValue).ToHashSet(IdentifiableComparer.Instance);
                rightResourceIds.ExceptWith(secondaryResourceIds);

                AssertIsNotClearingRequiredRelationship(relationship, primaryResource, rightResourceIds);

                using var collector = new PlaceholderResourceCollector(_resourceFactory, _dbContext);
                await UpdateRelationshipAsync(relationship, primaryResource, rightResourceIds, collector, cancellationToken);

                await _resourceDefinitionAccessor.OnWritingAsync(primaryResource, OperationKind.RemoveFromRelationship, cancellationToken);

                await SaveChangesAsync(cancellationToken);

                await _resourceDefinitionAccessor.OnWriteSucceededAsync(primaryResource, OperationKind.RemoveFromRelationship, cancellationToken);
            }
        }