我遇到了Microsoft Sync Framework 2.1的问题,而且我遇到了绊脚石。为了简化,假设我正在同步两个表, ConfigSet 和 ConfigItem ,它们具有以下结构:
|ConfigSet |
|-----------------|
|ConfigSetID (PK) |
|ConfigItemID (FK)|
|ConfigItem |
|-----------------|
|ConfigItemID (PK)|
|ConfigItem.Data |
我正在使用由 ConfigSetID 驱动的过滤条款:
ProvisionerObject.Tables["ConfigSet"].FilterParameters.Add(new SqlParameter("@ConfigSetID", SqlDbType.UniqueIdentifier));
ProvisionerObject.Tables["ConfigSet"].FilterClause = "[side].[ConfigSetID] = @ConfigSetID"
ProvisionerObject.Tables["ConfigItem"].FilterParameters.Add(new SqlParameter("@ConfigSetID", SqlDbType.UniqueIdentifier));
ProvisionerObject.Tables["ConfigItem"].FilterClause = "[side].[ConfigItemID] in (SELECT ConfigSet.ConfigItemID FROM ConfigSet WHERE ConfigSet.ConfigSetID = @ConfigSetID)"
如果我然后在服务器端创建两个ConfigItem记录,'Item1'& 'Item2',并创建一个ConfigSet记录,'Set1',它有一个外键到'Item1',然后执行同步它将正常工作,客户端将获得'Set1'记录,只有'Item1'从ConfigItem。
如果我然后在服务器上对'Set1'执行更新以使它现在指向'Item2',则同步框架检测到ConfigSet中的更改但是然后在客户端上抛出一个外键约束来说明记录'Item2'不存在。
似乎在同步ConfigItem时它没有检测到任何更改,因为从技术上来说,ConfigItem没有,但是如果第一次同步,则filter子句将返回Item2。
我知道每个表都是独立同步的,但有没有办法可以强制它获取'Item2'记录,即使该表没有变化?甚至更好(尽管我认为我正在用这个框架可以做的事情推动我的运气!)如果它可以删除客户端上的“Item1”,因为这在技术上不再由客户端同步/引用。 / p>
答案 0 :(得分:0)
不幸的是,同步框架不支持分区重组或进出范围的行。
您方案中最简单的解决方法是对item2进行虚拟更新,将其标记为已更改。但是,这意味着此更改也将被发送给具有item2的其他客户端,因为没有真正改变,所以浪费了事务。
对于已超出范围的客户端中的行,您可以从客户端删除它们并拦截ChangesSelected事件中的更改并从更改数据集中删除行,以便它们不会传播到服务器。或者您可以简单地清理客户端表并根据新的过滤器值重新初始化。