Dela via


Anvisningar: Lösa konflikter genom att behålla databasvärden

Om du vill stämma av skillnader mellan förväntade och faktiska databasvärden innan du försöker skicka ändringarna igen kan du använda OverwriteCurrentValues för att behålla de värden som finns i databasen. De aktuella värdena i objektmodellen skrivs sedan över. Mer information finns i Optimistisk samtidighet: Översikt.

Kommentar

I samtliga fall uppdateras posten på klienten först genom att de uppdaterade data hämtas från databasen. Den här åtgärden ser till att nästa uppdateringsförsök inte misslyckas vid samma samtidighetskontroller.

Exempel

I det här scenariot utlöses ett ChangeConflictException undantag när User1 försöker skicka ändringar, eftersom User2 under tiden har ändrat kolumnerna Assistent och Avdelning. I följande tabell visas situationen.

Tillstånd Ansvarig Assistent Avdelning
Ursprungligt databastillstånd vid frågor från User1 och User2. Alfreds Maria Sales
User1 förbereder sig för att skicka dessa ändringar. Alfred Marketing
User2 har redan skickat dessa ändringar. Mary Tjänst

User1 bestämmer sig för att lösa konflikten genom att låta de nyare databasvärdena skriva över de aktuella värdena i objektmodellen.

När User1 löser konflikten med hjälp OverwriteCurrentValuesav blir resultatet i databasen enligt följande i tabellen:

Tillstånd Ansvarig Assistent Avdelning
Nytt tillstånd efter konfliktlösning. Alfreds

(original)
Mary

(från User2)
Tjänst

(från User2)

Följande exempelkod visar hur du skriver över aktuella värden i objektmodellen med databasvärdena. (Ingen inspektion eller anpassad hantering av enskilda medlemskonflikter inträffar.)

Northwnd db = new Northwnd("...");
try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (ChangeConflictException e)
{
    Console.WriteLine(e.Message);
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        // All database values overwrite current values.
        occ.Resolve(RefreshMode.OverwriteCurrentValues);
    }
}
Dim db As New Northwnd("...")

Try
    db.SubmitChanges(ConflictMode.ContinueOnConflict)

Catch ex As ChangeConflictException
    Console.WriteLine(ex.Message)

    For Each occ As ObjectChangeConflict In db.ChangeConflicts
        ' All database values overwrite current values.
        occ.Resolve(Data.Linq.RefreshMode.OverwriteCurrentValues)
    Next

End Try

Se även