Anvisningar: Lösa konflikter genom att skriva över databasvärden
Om du vill stämma av skillnader mellan förväntade och faktiska databasvärden innan du försöker skicka ändringarna på nytt kan du använda KeepCurrentValues för att skriva över databasvärden. 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 skriva över databasvärden med de aktuella klientmedlemsvärdena.
När User1 löser konflikten med hjälp KeepCurrentValuesav blir resultatet i databasen som i följande tabell:
Tillstånd | Ansvarig | Assistent | Avdelning |
---|---|---|---|
Nytt tillstånd efter konfliktlösning. | Alfred (från User1) |
Maria (original) |
Marketing (från User1) |
Följande exempelkod visar hur du skriver över databasvärden med aktuella klientmedlemsvärden. (Ingen inspektion eller anpassad hantering av enskilda medlemskonflikter inträffar.)
try
{
db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
Console.WriteLine(e.Message);
foreach (ObjectChangeConflict occ in db.ChangeConflicts)
{
//No database values are merged into current.
occ.Resolve(RefreshMode.KeepCurrentValues);
}
}
Try
db.SubmitChanges(ConflictMode.ContinueOnConflict)
Catch ex As ChangeConflictException
Console.WriteLine(ex.Message)
For Each occ As ObjectChangeConflict In db.ChangeConflicts
' No database values are merged into current.
occ.Resolve(Data.Linq.RefreshMode.KeepCurrentValues)
Next
End Try