Entity Framework: Um objeto com a mesma chave já existe no objectstatemanager
Eu vejo que esta pergunta foi feita muito, no entanto eu não encontrei nada ainda que resolve o problema que estou tendo.
Obviamente, estou usando o Entity Framework para executar uma atualização em um registro. Depois que as atualizações forem concluídas, sempre que eu tentar salvar, recebo a seguinte mensagem de erro:
An object with the same key already exists in the objectstatemanager
No começo eu estava passando um objeto de coleção da visão que continha uma cópia doZipCodeTerritory
objeto de modelozipToUpdate
. Eu mudei o código puxando esse objeto para fora e apenas enviando os campos relevantes. No entanto, ainda estou recebendo o mesmo erro.
O que também é estranho é a primeira vez que executo este código, ele funciona bem. Qualquer tentativa depois disso eu recebo o erro.
Controlador
Aqui está o código do método que chama a função de edição
public static string DescriptionOnly(ZipCodeIndex updateZip)
{
if (!string.IsNullOrWhiteSpace(updateZip.newEffectiveDate) || !string.IsNullOrWhiteSpace(updateZip.newEndDate))
{
return "Neither effective or end date can be present if updating Territory Code only; ";
}
_updated = 0;
foreach (var zipCode in updateZip.displayForPaging.Where(x => x.Update))
{
ProcessAllChanges(zipCode, updateZip.newTerritory, updateZip.newStateCode, updateZip.newDescription, updateZip.newChannelCode);
}
_msg += _updated + " record(s) updated; ";
return _msg;
}
E aqui está o método que realmente faz a atualização.
private static void ProcessAllChanges(ZipCodeTerritory zipToUpdate, string newTerritory, string newStateCode, string newDescription, string newChannelCode)
{
try
{
if (!string.IsNullOrWhiteSpace(newTerritory)) zipToUpdate.IndDistrnId = newTerritory;
if (!string.IsNullOrWhiteSpace(newStateCode)) zipToUpdate.StateCode = newStateCode;
if (!string.IsNullOrWhiteSpace(newDescription)) zipToUpdate.DrmTerrDesc = newDescription;
if (!string.IsNullOrWhiteSpace(newChannelCode)) zipToUpdate.ChannelCode = newChannelCode;
if (zipToUpdate.EndDate == DateTime.MinValue) zipToUpdate.EndDate = DateTime.MaxValue;
_db.Entry(zipToUpdate).State = EntityState.Modified;
_db.SaveChanges();
_updated++;
}
catch (DbEntityValidationException dbEx)
{
_msg += "Error during update; ";
EventLog.WriteEntry("Monet", "Error during ProcessAllChanges: " + zipToUpdate.ToString() + " |EX| " + dbEx.Message);
}
catch (Exception ex)
{
_msg += "Error during update; ";
EventLog.WriteEntry("Monet", "Error during ProcessAllChanges: " + zipToUpdate.ToString() + " |MESSAGE| " + ex.Message);
}
}
EDITAR
oZipCodeIndex
objeto contém uma lista deZipCodeTerritory
objetos modelo. Eles não estão sendo extraídos de uma consulta linq, mas simplesmente passados de volta para o controlador a partir da exibição. Aqui está a assinatura do método do controlador que inicia o processo:
[HttpPost]
public ActionResult Update(ZipCodeIndex updateZip, string button)