/// <inheritdoc />
        public virtual async Task SetRelationshipAsync(TId primaryId, string relationshipName, object secondaryResourceIds, CancellationToken cancellationToken)
        {
            _traceWriter.LogMethodStart(new { primaryId, relationshipName, secondaryResourceIds });
            if (relationshipName == null)
            {
                throw new ArgumentNullException(nameof(relationshipName));
            }

            AssertHasRelationship(_request.Relationship, relationshipName);

            TResource resourceFromDatabase = await GetPrimaryResourceForUpdateAsync(primaryId, cancellationToken);

            _hookExecutor.BeforeUpdateRelationship(resourceFromDatabase);

            try
            {
                await _repositoryAccessor.SetRelationshipAsync(resourceFromDatabase, secondaryResourceIds, cancellationToken);
            }
            catch (DataStoreUpdateException)
            {
                await AssertResourcesExistAsync(TypeHelper.ExtractResources(secondaryResourceIds), cancellationToken);

                throw;
            }

            _hookExecutor.AfterUpdateRelationship(resourceFromDatabase);
        }
Beispiel #2
0
        /// <inheritdoc />
        public virtual async Task SetRelationshipAsync(TId primaryId, string relationshipName, object secondaryResourceIds, CancellationToken cancellationToken)
        {
            _traceWriter.LogMethodStart(new
            {
                primaryId,
                relationshipName,
                secondaryResourceIds
            });

            ArgumentGuard.NotNullNorEmpty(relationshipName, nameof(relationshipName));

            AssertHasRelationship(_request.Relationship, relationshipName);

            TResource resourceFromDatabase = await GetPrimaryResourceForUpdateAsync(primaryId, cancellationToken);

            await _resourceDefinitionAccessor.OnPrepareWriteAsync(resourceFromDatabase, OperationKind.SetRelationship, cancellationToken);

            _hookExecutor.BeforeUpdateRelationship(resourceFromDatabase);

            try
            {
                await _repositoryAccessor.SetRelationshipAsync(resourceFromDatabase, secondaryResourceIds, cancellationToken);
            }
            catch (DataStoreUpdateException)
            {
                await AssertRightResourcesExistAsync(secondaryResourceIds, cancellationToken);

                throw;
            }

            _hookExecutor.AfterUpdateRelationship(resourceFromDatabase);
        }