Ich schreibe eine API, die auf den Wert einer Entität zugreifen und prüfen muss, ob sie sich geändert hat (userChangedPairOrSingle).
public ActionResult<ProdutoFabricante> Put([FromBody] ProdutoFabricanteViewModel produtoFabricanteViewModel)
{
if (produtoFabricanteViewModel.Invalid)
{
return StatusCode(400, produtoFabricanteViewModel);
}
try
{
var actualProdutoFabricante = produtoFabricanteRepository.GetById(produtoFabricanteViewModel.Id);
if (produtoFabricanteService.userChangedPairOrSingle(produtoFabricanteViewModel, actualProdutoFabricante.Par))
{
if (produtoFabricanteService.produtoFabricanteHasItems(produtoFabricanteViewModel.Id))
{
return StatusCode(400, new { Message = "Não é possÃvel alterar " });
}
}
actualProdutoFabricante = mapper.Map<ProdutoFabricante>(produtoFabricanteViewModel);
produtoFabricanteRepository.Update(actualProdutoFabricante);
return Ok(actualProdutoFabricante);
}
catch (Exception ex)
{
return StatusCode(500, (ex.Message, InnerException: ex.InnerException?.Message));
}
}
Wenn ich jedoch auf dieselbe Entität zugreife, die ich aktualisieren möchte, wird der folgende Fehler angezeigt:
Die Instanz des Entitätstyps 'ProdutoFabricante' kann nicht verfolgt werden, da bereits eine andere Instanz mit dem Schlüsselwert '{Id: 13}' verfolgt wird. Stellen Sie beim Anhängen vorhandener Entitäten sicher, dass nur eine Entitätsinstanz mit einem bestimmten Schlüsselwert angehängt ist.
Wie kann ich diesen Fehler vermeiden?
Beim Mapping erstellen Sie eine neue Instanz (die nicht verfolgt wird), anstatt die vorhandene Instanz (die verfolgt wird) zu aktualisieren. Stattdessen müssen Sie Folgendes tun:
mapper.Map(produtoFabricanteViewModel, actualProdutoFabricante);
Dadurch bleibt die vorhandene Instanz erhalten und die Eigenschaftswerte werden einfach aktualisiert. Dann ist EF in Ordnung, da diese Instanz dieselbe ist, die verfolgt wird.