Condividi tramite


Procedura: risolvere i conflitti di concorrenza mediante l'unione con i valori del database (LINQ to SQL)

Per risolvere le differenze tra i valori del database previsti ed effettivi prima del tentativo di inviare di nuovo le modifiche, è possibile utilizzare KeepChanges per unire i valori del database con i valori del membro client corrente. Per ulteriori informazioni, vedere Cenni preliminari sulla concorrenza ottimistica (LINQ to SQL).

NotaNota

In tutti i casi, viene innanzitutto aggiornato il record sul client recuperando i dati aggiornati dal database.Questa azione assicura che il successivo tentativo di aggiornamento non avrà esito negativo durante gli stessi controlli di concorrenza.

Esempio

In questo scenario viene generata un'eccezione ChangeConflictException quando User1 tenta di inviare le modifiche, in quanto nel frattempo User2 ha modificato le colonne Assistant e Department. Nella tabella seguente è illustrata questa situazione.

 

Manager

Assistant

Department

Stato del database originale quando viene eseguita una query da User1 e User2.

Alfreds

Maria

Sales

User1 si prepara a inviare queste modifiche.

Alfred

 

Marketing

User2 ha già inviato queste modifiche.

 

Mary

Servizio

User1 decide di risolvere questo conflitto unendo i valori del database con i valori del membro client corrente. Di conseguenza, i valori del database verranno sovrascritti solo quando il set di modifiche corrente avrà modificato anche quel valore.

Quando User1 risolve il conflitto utilizzando KeepChanges, il risultato nel database sarà come nella tabella seguente:

 

Manager

Assistant

Department

Nuovo stato dopo la risoluzione dei conflitti.

Alfred

(da User1)

Mary

(da User2)

Marketing

(da User1)

Nell'esempio seguente viene illustrato come unire i valori del database con i valori del membro client corrente, a meno che il client non abbia modificato anche quel valore. Non si verifica alcun conflitto di ispezione o gestione personalizzata dei singoli membri.

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)
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);

Vedere anche

Attività

Procedura: risolvere i conflitti di concorrenza sovrascrivendo i valori del database (LINQ to SQL)

Procedura: risolvere i conflitti di concorrenza conservando i valori del database (LINQ to SQL)

Altre risorse

Procedura: gestire i conflitti di modifiche (LINQ to SQL)