Estou à 4horas tentando entender o porque disso está acontecendo mas não consigo, já pesquisei sobre a Exception mas não consigo identificar o erro no meu código/banco. Sou iniciante na área e comecei a estudar mvc tem 2 dias, então perdoem-me se eu deixar alguma informação passar despercebido, é só me alertar qual informação faltou que eu posto aqui.
Exception:
MySqlException: Cannot add or update a child row: a foreign key constraint fails (`crudvendasmvcdb`.`VendasRegistro`, CONSTRAINT `FK_VendasRegistro_Vendedor_VendedorId` FOREIGN KEY (`VendedorId`) REFERENCES `Vendedor` (`Id`) ON DELETE CASCADE)
MySqlConnector.Core.ServerSession.ReceiveReplyAsyncAwaited(ValueTask<ArraySegment<byte>> task) in `ServerSession.cs` , line 806
MySqlException: Cannot add or update a child row: a foreign key constraint fails (`crudvendasmvcdb`.`VendasRegistro`, CONSTRAINT `FK_VendasRegistro_Vendedor_VendedorId` FOREIGN KEY (`VendedorId`) REFERENCES `Vendedor` (`Id`) ON DELETE CASCADE)
MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet() in `MySqlDataReader.cs` , line 130
DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
CrudVendasMvc.Services.VendasRegistroService.AtualizarAsync(VendasRegistro obj) in `VendasRegistroService.cs`
+
109. await _context.SaveChangesAsync();
CrudVendasMvc.Controllers.VendasRegistrosController.Edit(int id, VendasRegistro venda) in `VendasRegistrosController.cs`
+
201. await _vendasRegistroService.AtualizarAsync(venda);
Tabelas:
mysql> desc VendasRegistro; +------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+-------------+------+-----+---------+----------------+ | Id | int | NO | PRI | NULL | auto_increment | | Data | datetime(6) | NO | | NULL | | | Quantia | double | NO | | NULL | | | Estado | int | NO | | NULL | | | VendedorId | int | NO | MUL | NULL | | +------------+-------------+------+-----+---------+----------------+ mysql> desc Vendedor; +----------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+-------------+------+-----+---------+----------------+ | Id | int | NO | PRI | NULL | auto_increment | | Nome | varchar(60) | NO | | NULL | | | Email | longtext | NO | | NULL | | | DataNascimento | datetime(6) | NO | | NULL | | | Salario | double | NO | | NULL | | | DepartamentoId | int | NO | MUL | NULL | | +----------------+-------------+------+-----+---------+----------------+ mysql> desc Departamento; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | Id | int | NO | PRI | NULL | auto_increment | | Nome | longtext | YES | | NULL | | +-------+----------+------+-----+---------+----------------+
VendasRegistrosController (EDIT (POST)):
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(int id, VendasRegistro venda)
{
if (!ModelState.IsValid)
{
var listaVendedores = await _vendedorService.EncontrarTodosAsync();
var listaEstados = Enum.GetValues(typeof(VendaEstado)).Cast<VendaEstado>().ToList();
var viewModel = new VendasRegistroViewModel{ VendasRegistro = venda, Estados = listaEstados, Vendedores = listaVendedores};
return View(viewModel);
}
if (id != venda.Id)
{
return RedirectToAction(nameof(Error), new { message = "Id não correspondente."});
}
try
{
await _vendasRegistroService.AtualizarAsync(venda);
return RedirectToAction(nameof(Index));
}
catch (ApplicationException ex)
{
return RedirectToAction(nameof(Error), new { Message = ex.Message});
}
}
Método "AtualizarAsync em VendasRegistroService:
public async Task AtualizarAsync(VendasRegistro obj)
{
if (!await _context.VendasRegistro.AnyAsync(venda => venda.Id == obj.Id))
{
throw new NotFoundException("Id não encontrado.");
}
try
{
_context.Update(obj);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException ex)
{
throw new DbUpdateConcurrencyException(ex.Message);
}
}
Resumo
Eu consigo criar um novo registro de venda e também consigo deletar sem problemas, só para dar o update que acontece isso.
Usei a mesma lógica para o Vendedor, consigo editar, cadastrar e deletar sem problemas.
Por onde começo a investigar a causa disso ?