Entity Framework: Obiekt z tym samym kluczem już istnieje w menedżerze obiektów

Widzę, że to pytanie zostało zadane bardzo często, jednak nie znalazłem jeszcze niczego, co rozwiązuje problem, który mam.

Oczywiście używam Entity Framework do przeprowadzenia aktualizacji rekordu. Jednak po zakończeniu aktualizacji za każdym razem, gdy próbuję zapisać, pojawia się następujący komunikat o błędzie:

An object with the same key already exists in the objectstatemanager

Najpierw przechodziłem przez obiekt kolekcji z widoku, który zawierał kopięZipCodeTerritory obiekt modeluzipToUpdate. Zmieniłem kod, wyciągając ten obiekt i wysyłając odpowiednie pola. Nadal jednak pojawia się ten sam błąd.

Co dziwne, po raz pierwszy uruchamiam ten kod, działa dobrze. Każda próba po tym pojawia się błąd.

Kontroler

Oto kod z metody wywołującej funkcję edycji

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;
}

A oto metoda, która faktycznie aktualizuje.

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);
    }
}

EDYTOWAĆ

TheZipCodeIndex obiekt zawiera listęZipCodeTerritory obiekty modelu. Nie są one pobierane z zapytania linq, ale po prostu przekazywane z powrotem do kontrolera. Oto podpis metody kontrolera, która rozpoczyna proces:

[HttpPost]
public ActionResult Update(ZipCodeIndex updateZip, string button)

questionAnswers(2)

yourAnswerToTheQuestion