Udostępnij za pośrednictwem


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)

Zobacz też