/// <inheritdoc /> public virtual async Task DeleteAsync(TId id, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { id }); using var collector = new PlaceholderResourceCollector(_resourceFactory, _dbContext); TResource resource = collector.CreateForId <TResource, TId>(id); foreach (RelationshipAttribute relationship in _resourceGraph.GetRelationships <TResource>()) { // Loads the data of the relationship, if in EF Core it is configured in such a way that loading the related // entities into memory is required for successfully executing the selected deletion behavior. if (RequiresLoadOfRelationshipForDeletion(relationship)) { NavigationEntry navigation = GetNavigationEntry(resource, relationship); await navigation.LoadAsync(cancellationToken); } } _dbContext.Remove(resource); await SaveChangesAsync(cancellationToken); }
/// <inheritdoc /> public virtual async Task DeleteAsync(TId id, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { id }); // This enables OnWritingAsync() to fetch the resource, which adds it to the change tracker. // If so, we'll reuse the tracked resource instead of a placeholder resource. var emptyResource = _resourceFactory.CreateInstance <TResource>(); emptyResource.Id = id; await _resourceDefinitionAccessor.OnWritingAsync(emptyResource, OperationKind.DeleteResource, cancellationToken); using var collector = new PlaceholderResourceCollector(_resourceFactory, _dbContext); TResource resource = collector.CreateForId <TResource, TId>(id); foreach (RelationshipAttribute relationship in _resourceGraph.GetRelationships <TResource>()) { // Loads the data of the relationship, if in EF Core it is configured in such a way that loading the related // entities into memory is required for successfully executing the selected deletion behavior. if (RequiresLoadOfRelationshipForDeletion(relationship)) { NavigationEntry navigation = GetNavigationEntry(resource, relationship); await navigation.LoadAsync(cancellationToken); } } _dbContext.Remove(resource); await SaveChangesAsync(cancellationToken); await _resourceDefinitionAccessor.OnWriteSucceededAsync(resource, OperationKind.DeleteResource, cancellationToken); }