我们目前正在使用Microsoft Sync Framework 2.1在云解决方案和胖客户端之间同步数据。同步由客户端启动,仅下载。两端都使用SQL Server,我使用SqlSyncScopeProvisioning类来配置范围。我们无法保证客户将运行我们软件的最新版本,但我们可以完全控制云部分,这将始终是最新的。
我们正在考虑支持范围的版本控制,以便例如,如果我修改一个表以具有新列,那么我可以保留任何原始范围(例如“ScopeA_V1”),同时添加涵盖所有相同范围的另一个范围数据作为第一个范围,但也包含新列(例如'ScopeA_V2')。这将允许旧版本的客户端在升级之前继续同步。
为了实现这一点,我正在以特定的方式设计数据模型更改,以便我只能添加列和表,永远不会删除,并且所有新列都必须可以为空。从理论上讲,我认为这应该允许我的示波器的旧版本继续运行,即使它们没有同步新数据。
我想我差不多了,但我遇到了绊脚石。当我配置现有范围的新版本时,我正在获取SelectChanges存储过程的正确版本副本,但是所有特定于表的存储过程(不是特定于范围 - 即tableA_update,tableA_delete等)都没有像我想的那样更新供应商认为它们是现有的,并且认为它们不需要更新。
有没有办法可以让配置程序更新相关的存储过程(_update,_insert等),以便它为默认值(null)的新列添加新参数,允许新旧使用它们的范围的版本?
此外,如果我这样做,那么当客户端升级到较新版本时,它是否会重新同步新列,即使这些行已经同步(虽然新列中有空值)?
或者我是以完全错误的方式来做这件事的?还有另一种方法可以使作用域向后兼容旧版本吗?
答案 0 :(得分:1)
Sync Framework开箱即用不支持更新范围定义以适应架构更改。 通过SetCreateProceduresForAdditionalScopeDefault创建新范围只会创建一个新范围和一个新的_selectchanges存储过程,但会重用所有其他存储过程,跟踪表,触发器和UDT。
我写了一系列关于需要更改以适应架构更改的博客文章:http://jtabadero.wordpress.com/2011/03/21/modifying-sync-framework-scope-definition-part-1-introduction/
后续帖子显示了一些破解配置脚本的方法。
如果添加新列将重新同步该列或行,则回答您的其他问题,答案是否定的。首先,更改跟踪位于行级别。第二,添加列不会触发更新跟踪表的触发器,以指示是否有要同步的更改。