0

我遇到了 Microsoft Sync Framework 2.1 的问题,遇到了绊脚石。为了简化,假设我正在同步两个表,ConfigSetConfigItem,它们具有以下结构:

|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”的外键,然后执行同步它会正常工作并且客户端将从 ConfigItem 中获取“Set1”记录和仅“Item1”。

如果我随后在服务器上对“Set1”执行更新,使其现在指向“Item2”,则同步框架会检测到 ConfigSet 中的更改,但随后会在客户端上抛出外键约束,说记录“Item2”没有存在。

似乎在同步 ConfigItem 时它没有检测到任何更改,因为从技术上讲,ConfigItem 没有任何更改,但是如果这是第一次同步,过滤子句将返回 Item2。

我知道每个表都是独立同步的,但是即使该表没有更改,有没有办法强制它获取“Item2”记录?更好的是(尽管我认为我正在用框架可以做的事情来推动我的运气!)如果它可以删除客户端上的“Item1”,因为这在技术上不再被客户端同步/引用。

4

1 回答 1

0

不幸的是,同步框架不支持分区重新对齐或行进出范围。

您的方案中最简单的解决方法是对 item2 进行虚拟更新以将其标记为已更改。但是,这意味着此更改也将发送给具有 item2 的其他客户端,因为没有真正更改,所以浪费了事务。

至于客户端中超出范围的行,您可以从客户端删除它们并拦截 ChangesSelected 事件中的更改并从更改数据集中删除这些行,这样它们就不会传播到服务器。或者您可以简单地清理客户端表并根据新的过滤器值重新初始化。

于 2012-06-27T10:48:13.590 回答