Instrukcje: Rozwiązywanie konfliktów, zastępując wartości bazy danych
Aby uzgodnić różnice między oczekiwanymi i rzeczywistymi wartościami bazy danych przed podjęciem próby ponownego przesłania zmian, możesz użyć KeepCurrentValues polecenia , aby zastąpić wartości bazy danych. Aby uzyskać więcej informacji, zobacz Optymistyczna współbieżność: omówienie.
Uwaga
We wszystkich przypadkach rekord na kliencie jest najpierw odświeżany przez pobranie zaktualizowanych danych z bazy danych. Ta akcja zapewnia, że kolejna próba aktualizacji nie zakończy się niepowodzeniem podczas tych samych testów współbieżności.
Przykład
W tym scenariuszu jest zgłaszany wyjątek, ChangeConflictException gdy użytkownik User1 próbuje przesłać zmiany, ponieważ użytkownik User2 w międzyczasie zmienił kolumny Asystent i Dział. W poniższej tabeli przedstawiono sytuację.
Stan | Menedżer | Asystent | Department |
---|---|---|---|
Oryginalny stan bazy danych po wysłaniu zapytania do użytkowników User1 i User2. | Alfreds | Maria | Sprzedaż |
Użytkownik User1 przygotowuje się do przesłania tych zmian. | Alfred | Marketing | |
Użytkownik User2 przesłał już te zmiany. | Mary | Usługa |
Użytkownik1 decyduje się rozwiązać ten konflikt, zastępując wartości bazy danych bieżącymi wartościami elementu członkowskiego klienta.
Gdy użytkownik User1 rozwiąże konflikt przy użyciu metody KeepCurrentValues, wynik w bazie danych jest taki jak w poniższej tabeli:
Stan | Menedżer | Asystent | Department |
---|---|---|---|
Nowy stan po rozwiązaniu konfliktu. | Alfred (od użytkownika 1) |
Maria (oryginalny) |
Marketing (od użytkownika 1) |
Poniższy przykładowy kod pokazuje, jak zastąpić wartości bazy danych bieżącymi wartościami elementu członkowskiego klienta. (Nie ma inspekcji ani niestandardowej obsługi konfliktów poszczególnych elementów członkowskich).
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