public async Task <IActionResult> SalvarTipoAtividadeAcomodacao([FromBody] TipoAtividadeAcomodacaoItem tipoAtividadeAcomodacaoToSave) { //AREA DE VALIDACAO string msgRule = ""; if (!ruleValidaNomeTipoAtividadeAcomodacao(tipoAtividadeAcomodacaoToSave.Nome_TipoAtividadeAcomodacao, ref msgRule)) { return(BadRequest(msgRule)); } //FIM AREA DE VALIDACAO if (_configuracaoContext.Set <TipoAtividadeAcomodacaoItem>().Any(e => e.Id_TipoAtividadeAcomodacao == tipoAtividadeAcomodacaoToSave.Id_TipoAtividadeAcomodacao)) { _configuracaoContext.TipoAtividadeAcomodacaoItems.Update(tipoAtividadeAcomodacaoToSave); } else { _configuracaoContext.TipoAtividadeAcomodacaoItems.Add(tipoAtividadeAcomodacaoToSave); } //Create Integration Event to be published through the Event Bus var tipoAtividadeAcomodacaoSaveEvent = new TipoAtividadeAcomodacaoSaveIE(tipoAtividadeAcomodacaoToSave.Id_TipoAtividadeAcomodacao, tipoAtividadeAcomodacaoToSave.Nome_TipoAtividadeAcomodacao); try { // Achieving atomicity between original Catalog database operation and the IntegrationEventLog thanks to a local transaction await _configuracaoIntegrationEventService.SaveEventAndTipoAtividadeAcomodacaoContextChangesAsync(tipoAtividadeAcomodacaoSaveEvent, tipoAtividadeAcomodacaoToSave); } catch (Exception e) { //Validações das CONSTRAINTS do BANCO if (ruleValidaNomeTipoAtividadeAcomodacaoUnique(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 _configuracaoIntegrationEventService.PublishThroughEventBusAsync(tipoAtividadeAcomodacaoSaveEvent); return(CreatedAtAction(nameof(SalvarTipoAtividadeAcomodacao), tipoAtividadeAcomodacaoToSave.Id_TipoAtividadeAcomodacao)); }
public async Task SaveEventAndTipoAtividadeAcomodacaoContextChangesAsync(IntegrationEvent evt, TipoAtividadeAcomodacaoItem tipoAtividadeAcomodacaoToSave) { var strategy = _configuracaoContext.Database.CreateExecutionStrategy(); await strategy.ExecuteAsync(async() => { using (var transaction = _configuracaoContext.Database.BeginTransaction()) { try { await _configuracaoContext.SaveChangesAsync(); //Tratamento de Identity ((Events.TipoAtividadeAcomodacaoSaveIE)evt).TipoAtividadeAcomodacaoId = tipoAtividadeAcomodacaoToSave.Id_TipoAtividadeAcomodacao; await _eventLogService.SaveEventAsync(evt, _configuracaoContext.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); } } }); }