Partager via


Procédure : résoudre des conflits d'accès concurrentiel en conservant des valeurs de base de données (LINQ to SQL)

Mise à jour : November 2007

Pour harmoniser les différences entre les valeurs de base de données attendues et réelles avant d'essayer de renvoyer vos modifications, vous pouvez utiliser OverwriteCurrentValues pour conserver les valeurs trouvées dans la base de données. Les valeurs actuelles dans le modèle objet sont alors remplacées. Pour plus d'informations, consultez Vue d'ensemble de l'accès concurrentiel optimiste (LINQ to SQL).

Remarque :

Dans tous les cas, l'enregistrement sur le client est actualisé lors de la récupération des données mises à jour de la base de données. Cette action permet de s'assurer que la prochaine tentative de mise à jour n'échouera pas sur les mêmes vérifications d'accès concurrentiel.

Exemple

Dans ce scénario, une exception ChangeConflictException est levée lorsque User1 tente de soumettre des modifications car User2 a modifié entre-temps les colonnes Assistant et Department. Le tableau suivant présente la situation.

 

Manager

Assistant

Department

État de la base de données d'origine lors d'une interrogation par User1 et User2.

Alfreds

Maria

Sales

User1 s'apprête à soumettre ces modifications.

Alfred

 

Marketing

User2 a déjà soumis ces modifications.

 

Mary

Service

User1 décide de résoudre ce conflit en remplaçant les valeurs actuelles dans le modèle objet par les valeurs de base de données les plus récentes.

Lorsque User1 résout le conflit à l'aide de OverwriteCurrentValues, le résultat dans la base de données se présente comme dans le tableau suivant :

 

Manager

Assistant

Department

Nouvel état après résolution du conflit.

Alfreds

(d'origine)

Mary

(de User2)

Service

(de User2)

Le code d'exemple suivant indique comment remplacer les valeurs actuelles dans le modèle objet par les valeurs de base de données. Aucune inspection ni aucune gestion personnalisée des conflits de membres individuels n'est effectuée.

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

Voir aussi

Autres ressources

Procédure : gérer les conflits de changement (LINQ to SQL)