Instrukcje: Rozwiązywanie konfliktów, zachowują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ć OverwriteCurrentValues metody , aby zachować wartości znalezione w bazie danych. Bieżące wartości w modelu obiektów są następnie zastępowane. 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, ponieważ nowsze wartości bazy danych zastępują bieżące wartości w modelu obiektów.
Gdy użytkownik User1 rozwiąże konflikt przy użyciu metody OverwriteCurrentValues, wynik w bazie danych jest następujący w tabeli:
Stan | Menedżer | Asystent | Department |
---|---|---|---|
Nowy stan po rozwiązaniu konfliktu. | Alfreds (oryginalny) |
Mary (od użytkownika 2) |
Usługa (od użytkownika 2) |
Poniższy przykładowy kod pokazuje, jak zastąpić bieżące wartości w modelu obiektów wartościami bazy danych. (Nie ma inspekcji ani niestandardowej obsługi konfliktów poszczególnych elementów członkowskich).
Northwnd db = new Northwnd("...");
try
{
db.SubmitChanges(ConflictMode.ContinueOnConflict);
}
catch (ChangeConflictException e)
{
Console.WriteLine(e.Message);
foreach (ObjectChangeConflict occ in db.ChangeConflicts)
{
// All database values overwrite current values.
occ.Resolve(RefreshMode.OverwriteCurrentValues);
}
}
Dim db As New Northwnd("...")
Try
db.SubmitChanges(ConflictMode.ContinueOnConflict)
Catch ex As ChangeConflictException
Console.WriteLine(ex.Message)
For Each occ As ObjectChangeConflict In db.ChangeConflicts
' All database values overwrite current values.
occ.Resolve(Data.Linq.RefreshMode.OverwriteCurrentValues)
Next
End Try