Udostępnij za pośrednictwem


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

Zobacz też