/// <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); } }