Microsoft sync framework 如何在资源调配期间更改客户端架构?

Microsoft sync framework 如何在资源调配期间更改客户端架构?,microsoft-sync-framework,Microsoft Sync Framework,我急于(从来不是一件好事)启动同步框架并在项目的“离线支持”截止日期前运行。我们在服务器上有一个SQLExpress 2008实例,然后将SQLCE部署到客户端。客户端将只与服务器同步,而不进行对等同步 到目前为止,我有以下工作: 服务器架构设置 创建和测试范围 服务器配置 客户端配置,带表创建 这一切的相对简单给我留下了深刻的印象。然后我意识到: 通过客户端配置到SQLCE创建的架构不会为uniqueidentifier类型设置默认值 未在客户端上创建FK约束 下面是用于创建客户机模式的代

我急于(从来不是一件好事)启动同步框架并在项目的“离线支持”截止日期前运行。我们在服务器上有一个SQLExpress 2008实例,然后将SQLCE部署到客户端。客户端将只与服务器同步,而不进行对等同步

到目前为止,我有以下工作:

  • 服务器架构设置
  • 创建和测试范围
  • 服务器配置
  • 客户端配置,带表创建
  • 这一切的相对简单给我留下了深刻的印象。然后我意识到:

    • 通过客户端配置到SQLCE创建的架构不会为uniqueidentifier类型设置默认值
    • 未在客户端上创建FK约束
    下面是用于创建客户机模式的代码(取自我在网上找到的一个示例)

    当Sync框架在客户机上创建模式时,我需要进行前面列出的其他更改(默认值、约束等)

    这就是我感到困惑(和沮丧)的地方: 我遇到了一个示例,其中显示了一个具有CreatingSchema事件的SqlCeClientSyncProvider。这个代码示例实际上显示了在列上设置RowGuid属性,这正是我需要做的。但是,什么是SqlCeClientSyncProvider?!这段时间(现在4天)我一直在同步代码中使用SqlCeSyncProvider。那么有一个SqlCeSyncProvider和一个SqlCeClientSyncProvider

    MSDN上的文档在解释这两个方面都不是很好

    我进一步弄不清是应该在供应时间还是在同步时间进行模式更改


    您如何建议我在设置期间对客户端CE架构进行架构更改?

    SqlCeSyncProvider和SqlCeClientSyncProvider是不同的

    后者通常被称为脱机提供程序,它是VisualStudio中本地数据库缓存项目项使用的提供程序。此提供程序与DbServerSyncProvider和SyncAgent配合使用,并在中心辐射拓扑中使用

    您正在使用的提供者称为协作提供者或对等提供者(也适用于中心辐射场景)。SqlCeSyncProvider与SqlSyncProvider和SyncOrchestrator配合使用,没有相应的Visual Studio工具支持

    这两个提供程序都需要设置参与的数据库

    这两种类型的提供程序以不同的方式提供跟踪和应用更改所需的同步对象。SchemaCreated事件仅适用于脱机提供程序。此get在第一次启动同步时以及框架检测到客户端数据库尚未设置(创建用户表和相应的同步框架对象)时触发


    其他提供程序使用的范围设置不应用PK以外的约束。因此,您必须在设置后执行一个步骤,以便自己在框架之外应用默认值和约束。

    SqlCeSyncProvider和SqlCeClientSyncProvider是不同的

    后者通常被称为脱机提供程序,它是VisualStudio中本地数据库缓存项目项使用的提供程序。此提供程序与DbServerSyncProvider和SyncAgent配合使用,并在中心辐射拓扑中使用

    您正在使用的提供者称为协作提供者或对等提供者(也适用于中心辐射场景)。SqlCeSyncProvider与SqlSyncProvider和SyncOrchestrator配合使用,没有相应的Visual Studio工具支持

    这两个提供程序都需要设置参与的数据库

    这两种类型的提供程序以不同的方式提供跟踪和应用更改所需的同步对象。SchemaCreated事件仅适用于脱机提供程序。此get在第一次启动同步时以及框架检测到客户端数据库尚未设置(创建用户表和相应的同步框架对象)时触发


    其他提供程序使用的范围设置不应用PK以外的约束。因此,您必须在设置后执行一个步骤,以便自己在框架之外应用默认值和约束。

    在不使用SyncAgent的情况下研究解决方案时,我发现以下方法也可行(除了上面我评论的解决方案外):

  • 配置客户机并让框架创建客户机[用户]模式。现在你有桌子了
  • 取消设置-这将取消编辑表/列的限制
  • 进行更改(在我的示例中,在PK列上设置Is RowGuid并添加FK约束)-这实际上需要我删除并添加列,因为您无法更改现有列的“Is RowGuid”属性
  • 使用DbSyncCreationOption.CreateOrUseExisting重新设置

  • 在不使用SyncAgent的情况下研究解决方案时,我发现以下方法也适用(除了上面我评论的解决方案外):

  • 配置客户机并让框架创建客户机[用户]模式。现在你有桌子了
  • 取消设置-这将取消编辑表/列的限制
  • 进行更改(在我的示例中,在PK列上设置Is RowGuid并添加FK约束)-这实际上需要我删除并添加列,因为您无法更改现有列的“Is RowGuid”属性
  • 使用DbSyncCreationOption.CreateOrUseExisting重新设置

  • 我发现SyncAgent的示例令人望而生畏,它似乎需要大量的适配器代码。由于时间紧迫,我最终使用了协作方法,但手动(从脚本)创建了客户机模式。这让我可以设置默认值和约束,然后设置客户端,但跳过了用户模式。不太完美,但让我振作起来。例子
    static void Provision()
    {
        SqlConnection serverConn = new SqlConnection(
            "Data Source=xxxxx, xxxx; Database=xxxxxx; " +
                "Integrated Security=False; Password=xxxxxx; User ID=xxxxx;");
    
        // create a connection to the SyncCompactDB database
        SqlCeConnection clientConn = new SqlCeConnection(
            @"Data Source='C:\SyncSQLServerAndSQLCompact\xxxxx.sdf'");
    
        // get the description of the scope from the SyncDB server database
        DbSyncScopeDescription scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope(
            ScopeNames.Main, serverConn);
    
        // create CE provisioning object based on the scope
        SqlCeSyncScopeProvisioning clientProvision = new SqlCeSyncScopeProvisioning(clientConn, scopeDesc);
        clientProvision.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting);
    
        // starts the provisioning process
        clientProvision.Apply();
    }