Procédure : Résoudre les conflits d’accès concurrentiel en fusionnant des valeurs de base de données
Pour harmoniser des différences entre des valeurs de base de données attendues et réelles avant de soumettre à nouveau vos modifications, vous pouvez utiliser KeepChanges pour fusionner des valeurs de base de données avec les valeurs de membre client actuelles. Pour plus d’informations, consultez Accès concurrentiel optimiste : Vue d’ensemble.
Notes
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.
État | 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 fusionnant des valeurs de base de données avec les valeurs de membre client actuelles. Les valeurs de base de données seront donc remplacées uniquement lorsque l'ensemble de modifications actuel aura également modifié cette valeur.
Lorsque User1 résout le conflit à l'aide de KeepChanges, le résultat dans la base de données se présente comme dans le tableau suivant :
État | Manager | Assistant | department |
---|---|---|---|
Nouvel état après résolution du conflit. | Alfred (de User1) |
Mary (de User2) |
Marketing (de User1) |
L'exemple suivant montre comment fusionner des valeurs de base de données avec les valeurs de membre client actuelles (à moins que le client ait également modifié cette valeur). Aucune inspection ni aucune gestion personnalisée des conflits de membres individuels n'est effectuée.
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)