我已经实现了一个似乎没有处理冲突的FullEnumerationSimpleSyncProvider
。
在构造函数中,我设置了以下属性:
this.Configuration.CollisionConflictResolutionPolicy = CollisionConflictResolutionPolicy.ApplicationDefined;
this.Configuration.ConflictResolutionPolicy = ConflictResolutionPolicy.ApplicationDefined;
this.ItemConstraint += new EventHandler<SimpleSyncItemConstraintEventArgs>(OnItemConstraint);
this.ItemConflicting += new EventHandler<SimpleSyncItemConflictingEventArgs>(OnItemConflicting);
我的约束和冲突的事件处理程序:
void OnItemConstraint(object sender, SimpleSyncItemConstraintEventArgs e)
{
e.SetResolutionAction(ConstraintConflictResolutionAction.Merge);
}
void OnItemConflicting(object sender, SimpleSyncItemConflictingEventArgs e)
{
e.SetResolutionAction(ConflictResolutionAction.Merge);
}
但是,当我在InsertItem()中报告冲突时,永远不会调用约束/冲突事件处理程序。
public override void InsertItem(
object itemData,
IEnumerable<SyncId> changeUnitsToCreate,
RecoverableErrorReportingContext recoverableErrorReportingContext,
out ItemFieldDictionary keyAndUpdatedVersion,
out bool commitKnowledgeAfterThisItem) {
// ...snip...
// Check if it is already there --- name collision
if (itemAlreadyExists)
{
recoverableErrorReportingContext.RecordConstraintError(ConstructDictionary(item.ID));
keyAndUpdatedVersion = null;
commitKnowledgeAfterThisItem = false;
return;
}
// ...snip...
}
我想在调用RecordConstraintError
时,同步框架会在InsertItem
退出后调用相应的事件处理程序。
非常感谢任何见解!
答案 0 :(得分:0)
如果您正在处理并发冲突并将SetResolutionAction设置为ConflictResolutionAction.Merge,则您的提供程序需要实现ISimpleSyncProviderConcurrencyConflictResolver接口(ResolveUpdateUpdateConflict,ResolveLocalDeleteRemoteUpdateConflict和ResolveLocalUpdateRemoteDeleteConflict。)
如果处理约束冲突并将ConstraintConflictResolutionAction设置为Merge,RenameDestination或RenameSource,则提供者需要实现ISimpleSyncProviderConstraintConflictResolver接口。
Microsoft Sync Framework Simple Provider – Concurrency Conflict Handling