2013-10-27 46 views
0

的ConflictResolver是:ConflictResolver是不工作的权利

csp.ConflictResolver.ClientUpdateServerUpdateAction = ResolveAction.ClientWins; 
csp.ConflictResolver.ClientUpdateServerDeleteAction = ResolveAction.ClientWins; 

如果如果客户端更新和删除服务器上的客户端更新和服务器更新或。每当我按btnSyn按钮服务器赢,但我希望客户赢。

请告诉我。

private void LoadData() 
{ 
    //dataGridView1.DataSource = ctx.Employees; 
    ctx.Refresh(System.Data.Objects.RefreshMode.ClientWins, ctx.Employees); 
    dataGridView1.DataSource = null; 
    dataGridView1.DataSource = ctx.Employees; 
} 
private void btnSave_Click(object sender, EventArgs e) 
{ 
    ctx.SaveChanges(); 
} 

private void btnRefresh_Click(object sender, EventArgs e) 
{ 
    LoadData(); 
} 

private void btnSync_Click(object sender, EventArgs e) 
{ 
    TaskTrackerDataEntityCacheSyncAgent syncAgent = new TaskTrackerDataEntityCacheSyncAgent(); 
    syncAgent.Employees.SyncDirection = SyncDirection.Bidirectional; 
    var syncStats = syncAgent.Synchronize(); 

    TaskTrackerDataEntityCacheClientSyncProvider csp = new TaskTrackerDataEntityCacheClientSyncProvider(); 
    csp.ConflictResolver.ClientDeleteServerUpdateAction = ResolveAction.ServerWins; 
    csp.ConflictResolver.ClientUpdateServerUpdateAction = ResolveAction.ClientWins; 
    csp.ConflictResolver.ClientUpdateServerDeleteAction = ResolveAction.ClientWins; 



    MessageBox.Show(String.Format("Uploaded/Downloaded: {0}/{1}{4}Uploads/Downloads Failed: {2}/{3}{4}", syncStats.TotalChangesUploaded, syncStats.TotalChangesDownloaded, syncStats.UploadChangesFailed, syncStats.DownloadChangesFailed, Environment.NewLine)); 
    LoadData(); 
} 

回答

0
private void btnSync_Click(object sender, EventArgs e) 
{ 
    //Create SyncAgent to have access to everything locally 
    TaskTrackerDataEntityCacheSyncAgent syncAgent = new TaskTrackerDataEntityCacheSyncAgent(); 
    //========================================================================================================= 
    //Determine the table and the direction for sync 
    syncAgent.Employees.SyncDirection = SyncDirection.Bidirectional; 
    //[Bidirectional(upload To the server first, then download from ther server)] 
    //[DownloadOnly (Download from the server after full Sync)] 
    //[Snapshot  (Complete Refresh everything)] 
    //[UploadOnly (upload to the server after full sync)] 
    //========================================================================================================= 
    //Create the ClientSyncProvider and ServerSyncProvider to use them in monitoring the failer in both sides 
    TaskTrackerDataEntityCacheServerSyncProvider ssp = new TaskTrackerDataEntityCacheServerSyncProvider(); 
    TaskTrackerDataEntityCacheClientSyncProvider csp = new TaskTrackerDataEntityCacheClientSyncProvider(); 
    //========================================================================================================= 
    //The SqlCeClientSyncProvider also includes a ConflictResolver property that you can use to resolve conflicts on the client. For each type of conflict, you can set a value from the ResolveAction enumeration: 
    //ClientWins, ServerWins, FireEvent 

    //There is no requirement to set the ConflictResolver for each type of conflict. 
    //You can resolve conflicts as you do on the server, by handling the ApplyChangeFailed event 
    csp.ConflictResolver.ClientDeleteServerUpdateAction = ResolveAction.ClientWins; 
    csp.ConflictResolver.ClientUpdateServerUpdateAction = ResolveAction.ClientWins; 
    csp.ConflictResolver.ClientUpdateServerDeleteAction = ResolveAction.ClientWins; 
    csp.ConflictResolver.ClientDeleteServerUpdateAction = ResolveAction.ClientWins; 
    csp.ConflictResolver.ClientInsertServerInsertAction = ResolveAction.ClientWins; 
    csp.ConflictResolver.StoreErrorAction = ResolveAction.ClientWins; 
    csp.ApplyChangeFailed += SampleClientSyncProvider_ApplyChangeFailed; 
    ssp.ApplyChangeFailed += SampleClientSyncProvider_ApplyChangeFailed; 
    //========================================================================================================= 
    //Add the ClientSyncProvider and ServerSyncProvider to the syncAgnet 
    syncAgent.LocalProvider = csp; 
    syncAgent.RemoteProvider = ssp; //it will help to generate exception when the client update refused 
    //========================================================================================================= 
    //Call Sync method and recieve the a report about it 
    SyncStatistics synStats = syncAgent.Synchronize(); 
    //========================================================================================================= 
    //Display the sync stats 
    MessageBox.Show(String.Format("Uploaded/Downloaded:{0}/{1}{4}", synStats.TotalChangesUploaded, synStats.TotalChangesDownloaded, synStats.UploadChangesFailed, synStats.DownloadChangesFailed, Environment.NewLine)); 
    //============================================================== 
    //LoadData(); //It is function to reload the data 
} 
//================================================================ 
//This function will run the client update over server update 
private void SampleClientSyncProvider_ApplyChangeFailed(object sender, ApplyChangeFailedEventArgs e) 
{ 

    //Log event data from the client side. 
    //EventLogger.LogEvents(sender, e); 


    if (e.Conflict.ConflictType == ConflictType.ClientInsertServerInsert) 
    { 
    //e.Action = ApplyAction.Continue;   // ignore the conflict and continue synchronization. 
    //e.Action = ApplyAction.RetryApplyingRow; //retry applying the row. The retry will fail, and the event will be raised again if you do not address the cause of the conflict by changing one or both of the conflicting rows. 
    e.Action = ApplyAction.RetryWithForceWrite; //retry with logic to force applying the change. 
    } 
    if (e.Conflict.ConflictType == ConflictType.ClientDeleteServerUpdate) 
    { 
    //e.Action = ApplyAction.Continue;   // ignore the conflict and continue synchronization. 
    //e.Action = ApplyAction.RetryApplyingRow; //retry applying the row. The retry will fail, and the event will be raised again if you do not address the cause of the conflict by changing one or both of the conflicting rows. 
    e.Action = ApplyAction.RetryWithForceWrite; //retry with logic to force applying the change. 
    } if (e.Conflict.ConflictType == ConflictType.ClientUpdateServerDelete) 
    { 
    //e.Action = ApplyAction.Continue;   // ignore the conflict and continue synchronization. 
    //e.Action = ApplyAction.RetryApplyingRow; //retry applying the row. The retry will fail, and the event will be raised again if you do not address the cause of the conflict by changing one or both of the conflicting rows. 
    e.Action = ApplyAction.RetryWithForceWrite;//retry with logic to force applying the change. 
    } 
    if (e.Conflict.ConflictType == ConflictType.ClientUpdateServerUpdate) 
    { 
    //e.Action = ApplyAction.Continue;   // ignore the conflict and continue synchronization. 
    //e.Action = ApplyAction.RetryApplyingRow; //retry applying the row. The retry will fail, and the event will be raised again if you do not address the cause of the conflict by changing one or both of the conflicting rows. 
    e.Action = ApplyAction.RetryWithForceWrite; //retry with logic to force applying the change. 
    //Logic goes here. 
    } 

    if (e.Conflict.ConflictType == ConflictType.ErrorsOccurred) 
    { 
    //Logic goes here. 

    } 
} 
0

这真的不清楚你问,这是什么代码是应该做的,你已经尝试解决这个东西,但你似乎创造一个SyncProvider,不要用它做任何事情。

正如我从几个网络搜索收集命中“的SyncProvider申请ConflictResolver”,你需要做的是这样的:

syncAgent.LocalProvider.ConflictResolver.ClientDeleteServerUpdateAction = ...