我遇到了 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”的外键,然后执行同步它会正常工作并且客户端将从 ConfigItem 中获取“Set1”记录和仅“Item1”。
如果我随后在服务器上对“Set1”执行更新,使其现在指向“Item2”,则同步框架会检测到 ConfigSet 中的更改,但随后会在客户端上抛出外键约束,说记录“Item2”没有存在。
似乎在同步 ConfigItem 时它没有检测到任何更改,因为从技术上讲,ConfigItem 没有任何更改,但是如果这是第一次同步,过滤子句将返回 Item2。
我知道每个表都是独立同步的,但是即使该表没有更改,有没有办法强制它获取“Item2”记录?更好的是(尽管我认为我正在用框架可以做的事情来推动我的运气!)如果它可以删除客户端上的“Item1”,因为这在技术上不再被客户端同步/引用。