Entity Framework: Im objectstatemanager ist bereits ein Objekt mit demselben Schlüssel vorhanden

Ich sehe, dass diese Frage oft gestellt wurde, aber ich habe noch nichts gefunden, was das Problem, das ich habe, löst.

Offensichtlich verwende ich das Entity Framework, um ein Update für einen Datensatz durchzuführen. Sobald die Aktualisierungen abgeschlossen sind, wird bei jedem Versuch, sie zu speichern, die folgende Fehlermeldung angezeigt:

An object with the same key already exists in the objectstatemanager

Zuerst habe ich ein Sammlungsobjekt aus der Sicht übergeben, das eine Kopie des. EnthieltZipCodeTerritory ModellobjektzipToUpdate. Ich habe den Code geändert, indem ich dieses Objekt herausgezogen und stattdessen nur die entsprechenden Felder gesendet habe. Ich erhalte jedoch immer noch den gleichen Fehler.

Was auch komisch ist, ist das erste Mal, dass ich diesen Code ausführe, es funktioniert gut. Bei jedem weiteren Versuch erhalte ich den Fehler.

Regler

Hier ist der Code aus der Methode, die die Bearbeitungsfunktion aufruft

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

Und hier ist die Methode, die die Aktualisierung tatsächlich durchführt.

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

BEARBEITEN

DasZipCodeIndex Objekt enthält eine Liste vonZipCodeTerritory Objekte modellieren. Diese werden nicht aus einer Linq-Abfrage abgerufen, sondern einfach aus der Ansicht an den Controller zurückgegeben. Hier ist die Signatur der Controller-Methode, die den Prozess startet:

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage