除上面描述的冲突类型外,MSF还定义了三个内置的行为来解决冲突,它们定义在ApplyAction枚举量中:
◆ Continue 这是默认的行为,它允许你继续到列表中下一个冲突。
◆ RetryApplyingRow 将会重新尝试应用对行的修改,除非你使用某种方法修改了数据,否则就会失败(通常是在代码中使用自定义的冲突解决方案,匹配业务逻辑解决冲突)。
◆ RetryWithForceWrite 将会强制应用程序修改行(覆盖任何冲突的数据)。
在接下来的内容中,我们将会看到这些行为对某些冲突类型的处理结果。
使用ApplyChangeFailed解决冲突
知道冲突类型很重要,但你也需要知道是哪一行发生了冲突,MSF在DbServerSyncProvider和SqlCeClientSyncProvider上都提供了ApplyChangeFailed事件,允许你审查冲突信息,然后决定如何处理。在服务器和客户端SyncProvider上都有可能引发事件,取决于同步的阶段,ApplyChangeFailedEventArgs对象具有Action和Conflict属性,Action属性用于解决冲突,只要将其设为前一小节描述的ApplyAction类型的一个值即可;Conflict属性描述了更详细的冲突信息,如它的类型和发生冲突的行。
ApplyChangeFailedEventArgs对象还有一个Context属性,它允许你修改正在同步的数据,你可以使用它创建自己的冲突解决方案,这样你在处理复杂数据冲突时可以更加得心应手。
我们来看一些例子吧,我们创建了一个项目,显示一个跟踪顾客喜欢的数字的表,窗体的上半部分显示了服务端数据拷贝,窗体的下半部分显示了客户端缓存中的数据拷贝,我们可以修改任何一半的数据,然后保存数据到服务器和客户端,接着尝试同步数据,如果遇到数据冲突,会显示一个自定义窗体,让我们选择一个ApplyAction类型来解决冲突。
