Sdílet prostřednictvím


Postupy: Řešení konfliktů přepsáním hodnot v databázi

Chcete-li odsouhlasit rozdíly mezi očekávanými a skutečnými hodnotami databáze před pokusem o opětovné odeslání změn, můžete použít KeepCurrentValues k přepsání hodnot databáze. Další informace najdete v tématu Optimistická souběžnost: Přehled.

Poznámka:

Ve všech případech se záznam klienta nejprve aktualizuje načtením aktualizovaných dat z databáze. Tato akce zajistí, že další pokus o aktualizaci nebude neúspěšný na stejných kontrolách souběžnosti.

Příklad

V tomto scénáři se vyvolá výjimka, ChangeConflictException když se Uživatel1 pokusí odeslat změny, protože Uživatel2 mezitím změnil sloupce Asistent a Oddělení. Následující tabulka ukazuje situaci.

Stav Manažer Pomocník Oddělení
Původní stav databáze při dotazech uživatelem User1 a User2 Alfreds Maria Prodej
Uživatel1 se připraví k odeslání těchto změn. Alfred Marketing
Uživatel 2 už tyto změny odeslal. Mary Služba

Uživatel 1 se rozhodne tento konflikt vyřešit přepsáním hodnot databáze s aktuálními hodnotami člena klienta.

Když Uživatel1 konflikt vyřeší pomocí KeepCurrentValues, výsledek v databázi je jako v následující tabulce:

Stav Manažer Pomocník Oddělení
Nový stav po vyřešení konfliktů Alfred

(z user1)
Maria

(původní)
Marketing

(z user1)

Následující příklad kódu ukazuje, jak přepsat hodnoty databáze hodnotami aktuálního člena klienta. (Nedochází k žádným kontrolám ani vlastnímu zpracování konfliktů jednotlivých členů.)

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

Viz také