public virtual async Task <TResource> UpdateAsync(TId id, TResource requestEntity) { _logger.LogTrace($"Entering {nameof(UpdateAsync)}('{id}', {(requestEntity == null ? "null" : "object")})."); TResource databaseEntity = await _repository.Get(id).FirstOrDefaultAsync(); if (databaseEntity == null) { string resourceId = TypeHelper.GetResourceStringId <TResource, TId>(id, _resourceFactory); throw new ResourceNotFoundException(resourceId, _currentRequestResource.ResourceName); } _resourceChangeTracker.SetInitiallyStoredAttributeValues(databaseEntity); _resourceChangeTracker.SetRequestedAttributeValues(requestEntity); requestEntity = IsNull(_hookExecutor) ? requestEntity : _hookExecutor.BeforeUpdate(AsList(requestEntity), ResourcePipeline.Patch).Single(); await _repository.UpdateAsync(requestEntity, databaseEntity); if (!IsNull(_hookExecutor, databaseEntity)) { _hookExecutor.AfterUpdate(AsList(databaseEntity), ResourcePipeline.Patch); _hookExecutor.OnReturn(AsList(databaseEntity), ResourcePipeline.Patch); } _repository.FlushFromCache(databaseEntity); TResource afterEntity = await _repository.Get(id).FirstOrDefaultAsync(); _resourceChangeTracker.SetFinallyStoredAttributeValues(afterEntity); bool hasImplicitChanges = _resourceChangeTracker.HasImplicitChanges(); return(hasImplicitChanges ? afterEntity : null); }
/// <inheritdoc /> public virtual async Task <TResource> UpdateAsync(TId id, TResource requestResource) { _traceWriter.LogMethodStart(new { id, requestResource }); if (requestResource == null) { throw new ArgumentNullException(nameof(requestResource)); } TResource databaseResource = await GetPrimaryResourceById(id, false); _resourceChangeTracker.SetInitiallyStoredAttributeValues(databaseResource); _resourceChangeTracker.SetRequestedAttributeValues(requestResource); if (_hookExecutor != null) { requestResource = _hookExecutor.BeforeUpdate(AsList(requestResource), ResourcePipeline.Patch).Single(); } await _repository.UpdateAsync(requestResource, databaseResource); if (_hookExecutor != null) { _hookExecutor.AfterUpdate(AsList(databaseResource), ResourcePipeline.Patch); _hookExecutor.OnReturn(AsList(databaseResource), ResourcePipeline.Patch); } _repository.FlushFromCache(databaseResource); TResource afterResource = await GetPrimaryResourceById(id, false); _resourceChangeTracker.SetFinallyStoredAttributeValues(afterResource); bool hasImplicitChanges = _resourceChangeTracker.HasImplicitChanges(); return(hasImplicitChanges ? afterResource : null); }
public virtual async Task <TResource> UpdateAsync(TId id, TResource requestResource) { _logger.LogTrace($"Entering {nameof(UpdateAsync)}('{id}', {(requestResource == null ? "null" : "object")})."); TResource databaseResource = await GetPrimaryResourceById(id, false); _resourceChangeTracker.SetInitiallyStoredAttributeValues(databaseResource); _resourceChangeTracker.SetRequestedAttributeValues(requestResource); if (_hookExecutor != null) { requestResource = _hookExecutor.BeforeUpdate(AsList(requestResource), ResourcePipeline.Patch).Single(); } await _repository.UpdateAsync(requestResource, databaseResource); if (_hookExecutor != null) { _hookExecutor.AfterUpdate(AsList(databaseResource), ResourcePipeline.Patch); _hookExecutor.OnReturn(AsList(databaseResource), ResourcePipeline.Patch); } _repository.FlushFromCache(databaseResource); TResource afterResource = await GetPrimaryResourceById(id, false); _resourceChangeTracker.SetFinallyStoredAttributeValues(afterResource); bool hasImplicitChanges = _resourceChangeTracker.HasImplicitChanges(); return(hasImplicitChanges ? afterResource : null); }
public virtual async Task <TResource> UpdateAsync(TId id, TResource entity) { entity = IsNull(_hookExecutor) ? entity : _hookExecutor.BeforeUpdate(AsList(entity), ResourcePipeline.Patch).SingleOrDefault(); entity = await _repository.UpdateAsync(entity); if (!IsNull(_hookExecutor, entity)) { _hookExecutor.AfterUpdate(AsList(entity), ResourcePipeline.Patch); entity = _hookExecutor.OnReturn(AsList(entity), ResourcePipeline.Patch).SingleOrDefault(); } return(entity); }
public void AfterUpdateResource <TResource>(TResource resource) where TResource : class, IIdentifiable { _resourceHookExecutor.AfterUpdate(resource.AsList(), ResourcePipeline.Patch); }