如何在配置期间更改客户端架构?

时间:2011-10-14 18:07:11

标签: microsoft-sync-framework

我急于(从来不是一件好事)让Sync Framework启动并运行我的项目的“离线支持”截止日期。我们的服务器上有一个SQL Express 2008实例,然后将SQLCE部署到客户端。客户端只与服务器同步,没有点对点。

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

  1. 服务器架构设置
  2. 创建并测试了范围
  3. 已配置服务器
  4. 客户端配置w / table creation
  5. 我对所有这些相对简单的印象非常深刻。然后我意识到以下几点:

    • 通过客户端配置创建到SQLCE的架构不会为uniqueidentifier类型设置默认值。
    • 未在客户端上创建FK约束

    以下是用于创建客户端架构的代码(从我在网上找到的示例中提取)

    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();
    }
    

    当Sync Framework在客户端上创建架构时,我需要进行前面列出的其他更改(默认值,约束等)。

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

    MSDN上的文档在解释其中任何一个方面都不是很好。

    我进一步混淆了是否应该在配置时或同步时进行架构更改?

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

2 个答案:

答案 0 :(得分:3)

SqlCeSyncProvider与SqlCeClientSyncProvider不同。

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

您正在使用的那个称为协作提供程序或对等提供程序(它也适用于中心辐射方案)。 SqlCeSyncProvider与SqlSyncProvider和SyncOrchestrator一起使用,没有相应的Visual Studio工具支持。

两家提供商都要求配置参与的数据库。

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

其他提供商使用的范围配置不应用PK以外的约束。所以你必须做一个后配置步骤,在框架之外自己应用默认值和约束。

答案 1 :(得分:1)

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

  1. 配置客户端并让框架创建客户端[user]架构。现在你有了你的桌子。
  2. 取消配置 - 这消除了编辑表/列的限制
  3. 进行更改(在我的情况下,在PK列上设置RowGuid并添加FK约束) - 这实际上要求我删除并添加列,因为您无法将“Is RowGuid”属性更改为现有列
  4. 使用DbSyncCreationOption.CreateOrUseExisting再次提供