public async Task <IActionResult> SalvarCaracteristicaAcomodacao([FromBody] CaracteristicaAcomodacaoItem caracteristicaAcomodacaoToSave) { //AREA DE VALIDACAO string msgRule = ""; if (!ruleValidaNomeCaracteristica(caracteristicaAcomodacaoToSave.nome_CaracteristicaAcomodacao, ref msgRule)) { return(BadRequest(msgRule)); } //FIM AREA DE VALIDACAO if (_administrativoContext.Set <CaracteristicaAcomodacaoItem>().Any(e => e.id_CaracteristicaAcomodacao == caracteristicaAcomodacaoToSave.id_CaracteristicaAcomodacao)) { _administrativoContext.CaracteristicaAcomodacaoItems.Update(caracteristicaAcomodacaoToSave); } else { _administrativoContext.CaracteristicaAcomodacaoItems.Add(caracteristicaAcomodacaoToSave); } //Create Integration Event to be published through the Event Bus var caracteristicaAcomodacaoSaveEvent = new CaracteristicaAcomodacaoSaveIE(caracteristicaAcomodacaoToSave.id_CaracteristicaAcomodacao, caracteristicaAcomodacaoToSave.nome_CaracteristicaAcomodacao); try { // Achieving atomicity between original Catalog database operation and the IntegrationEventLog thanks to a local transaction await _administrativoIntegrationEventService.SaveEventAndCaracteristicaAcomodacaoContextChangesAsync(caracteristicaAcomodacaoSaveEvent, caracteristicaAcomodacaoToSave); } catch (Exception e) { //Validações das CONSTRAINTS do BANCO if (ruleValidaNomeCaracteristicaAcomodacaoUnique(e.Message, ref msgRule)) { return(BadRequest(msgRule)); } else { return(BadRequest(e.Message)); } } // Publish through the Event Bus and mark the saved event as published await _administrativoIntegrationEventService.PublishThroughEventBusAsync(caracteristicaAcomodacaoSaveEvent); return(CreatedAtAction(nameof(SalvarCaracteristicaAcomodacao), caracteristicaAcomodacaoToSave.id_CaracteristicaAcomodacao)); }
public async Task SaveEventAndCaracteristicaAcomodacaoContextChangesAsync(IntegrationEvent evt, CaracteristicaAcomodacaoItem caracteristicaAcomodacaoToSave) { var strategy = _administrativoContext.Database.CreateExecutionStrategy(); await strategy.ExecuteAsync(async() => { using (var transaction = _administrativoContext.Database.BeginTransaction()) { try { await _administrativoContext.SaveChangesAsync(); //Tratamento de Identity ((Events.CaracteristicaAcomodacaoSaveIE)evt).CaracteristicaAcomodacaoId = caracteristicaAcomodacaoToSave.id_CaracteristicaAcomodacao; await _eventLogService.SaveEventAsync(evt, _administrativoContext.Database.CurrentTransaction.GetDbTransaction()); transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); var sqlException = ex.InnerException as System.Data.SqlClient.SqlException; throw new Exception(sqlException.Number + "::" + sqlException.Message); } } }); }