Udostępnij za pośrednictwem


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

Zobacz też