Instrukcje: Rozwiązywanie konfliktów, scalając wartości bazy danych
Aby uzgodnić różnice między oczekiwanymi i rzeczywistymi wartościami bazy danych przed podjęciem próby ponownego wprowadzania zmian, możesz użyć KeepChanges polecenia , aby scalić wartości bazy danych z bieżącymi wartościami elementów członkowskich klienta. 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, scalając wartości bazy danych z bieżącymi wartościami elementu członkowskiego klienta. Wynikiem będzie to, że wartości bazy danych są zastępowane tylko wtedy, gdy bieżący zestaw zmian również zmodyfikował te wartości.
Gdy użytkownik User1 rozwiąże konflikt przy użyciu metody KeepChanges, 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) |
Mary (od użytkownika 2) |
Marketing (od użytkownika 1) |
W poniższym przykładzie pokazano, jak scalić wartości bazy danych z bieżącymi wartościami elementu członkowskiego klienta (chyba że klient również zmienił te wartości). 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);
// 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)