Postupy: Řešení konfliktů přepsáním hodnot v databázi
Chcete-li odsouhlasit rozdíly mezi očekávanými a skutečnými hodnotami databáze před pokusem o opětovné odeslání změn, můžete použít KeepCurrentValues k přepsání hodnot databáze. Další informace najdete v tématu Optimistická souběžnost: Přehled.
Poznámka:
Ve všech případech se záznam klienta nejprve aktualizuje načtením aktualizovaných dat z databáze. Tato akce zajistí, že další pokus o aktualizaci nebude neúspěšný na stejných kontrolách souběžnosti.
Příklad
V tomto scénáři se vyvolá výjimka, ChangeConflictException když se Uživatel1 pokusí odeslat změny, protože Uživatel2 mezitím změnil sloupce Asistent a Oddělení. Následující tabulka ukazuje situaci.
Stav | Manažer | Pomocník | Oddělení |
---|---|---|---|
Původní stav databáze při dotazech uživatelem User1 a User2 | Alfreds | Maria | Prodej |
Uživatel1 se připraví k odeslání těchto změn. | Alfred | Marketing | |
Uživatel 2 už tyto změny odeslal. | Mary | Služba |
Uživatel 1 se rozhodne tento konflikt vyřešit přepsáním hodnot databáze s aktuálními hodnotami člena klienta.
Když Uživatel1 konflikt vyřeší pomocí KeepCurrentValues, výsledek v databázi je jako v následující tabulce:
Stav | Manažer | Pomocník | Oddělení |
---|---|---|---|
Nový stav po vyřešení konfliktů | Alfred (z user1) |
Maria (původní) |
Marketing (z user1) |
Následující příklad kódu ukazuje, jak přepsat hodnoty databáze hodnotami aktuálního člena klienta. (Nedochází k žádným kontrolám ani vlastnímu zpracování konfliktů jednotlivých členů.)
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