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)

questionAnswers(2)

yourAnswerToTheQuestion