Dela via


Anvisningar: Lösa konflikter genom att slå samman med 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 KeepChanges för att sammanfoga databasvärden med de aktuella klientmedlemsvärdena. 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 den här konflikten genom att slå samman databasvärden med de aktuella klientmedlemsvärdena. Resultatet blir att databasvärden endast skrivs över när den aktuella ändringsuppsättningen också har ändrat det värdet.

När User1 löser konflikten med hjälp KeepChangesav blir resultatet i databasen som i följande tabell:

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

(från User1)
Mary

(från User2)
Marketing

(från User1)

I följande exempel visas hur du sammanfogar databasvärden med de aktuella klientmedlemsvärdena (såvida inte klienten också har ändrat det värdet). Ingen inspektion eller anpassad hantering av enskilda medlemskonflikter inträffar.

try
{
    db.SubmitChanges(ConflictMode.ContinueOnConflict);
}

catch (ChangeConflictException e)
{
    Console.WriteLine(e.Message);
    // Automerge database values for members that client
    // has not modified.
    foreach (ObjectChangeConflict occ in db.ChangeConflicts)
    {
        occ.Resolve(RefreshMode.KeepChanges);
    }
}

// Submit succeeds on second try.
db.SubmitChanges(ConflictMode.FailOnFirstConflict);
Try
    db.SubmitChanges(ConflictMode.ContinueOnConflict)

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

    For Each occ As ObjectChangeConflict In db.ChangeConflicts
        ' Automerge database values into current for members
        ' that client has not modified.
        occ.Resolve(Data.Linq.RefreshMode.KeepChanges)
    Next

End Try

' Submit succeeds on second try.
db.SubmitChanges(ConflictMode.FailOnFirstConflict)

Se även