public enum ApplyAction
{
Continue = 0,
RetryApplyingRow = 1,
RetryWithForceWrite = 2,
}
partial void OnInitialized()
this.ApplyChangeFailed += ServerApplyChangeFailed;
/// <summary>
/// Resolver de conflits
/// Les règles de résolutions sont :
/// * ClientDeleteServerUpdate : Le client l'emporte. La suppression coté client est maintenue.
/// * ClientUpdateServerDelete : Le Serveur l'emporte. La mise à jour coté client est annulée.
/// * ClientInsertServerInsert : Le Serveur l'emporte. L'insertion client est annulée.
/// * ClientUpdateServerUpdate : Le Serveur l'emporte. La mise à jour coté client est annulée.
/// </summary>
private void ServerApplyChangeFailed(object sender, ApplyChangeFailedEventArgs e)
if (e.TableMetadata.TableName == "Client")
ResolveTableClientConflict(e);
private void ResolveTableClientConflict(ApplyChangeFailedEventArgs e)
//
// ClientUpdateServerUpdate
// Ici Résolution conditionnelle
// Le retour ou non vers le client d'une ligne en conflit dépend d'une règle métier imposée
if (e.Conflict.ConflictType == ConflictType.ClientUpdateServerUpdate)
// ClientDeleteServerUpdate
// Ici le client l'emporte
// La suppression coté cliente l'emporte, les données modifiées coté serveur sont effacées
// On force donc la suppression
if (e.Conflict.ConflictType == ConflictType.ClientDeleteServerUpdate)
// ClientUpdateServerDelete
// Ici le serveur l'emporte
// Les changements devront bien être appliqués coté client
// Le serveur ayant raison, on applique pas la mise à jour, on continue donc.
if (e.Conflict.ConflictType == ConflictType.ClientUpdateServerDelete)
// ClientInsertServerInsert
// Le serveur ayant raison, on ne garde que l'insertion coté serveur
if (e.Conflict.ConflictType == ConflictType.ClientInsertServerInsert)
e.Action = ApplyAction.Continue;
return;
e.Action = ApplyAction.RetryWithForceWrite;