【问题标题】:How to change client schema during provisioning?如何在配置期间更改客户端架构?
【发布时间】:2023-03-29 22:00:01
【问题描述】:

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

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

  1. 服务器架构设置
  2. 创建和测试范围
  3. 已配置服务器
  4. 通过创建表来配置客户端

我对所有这一切的相对简单印象深刻。然后我意识到以下几点:

  • 通过客户端配置到 SQLCE 创建的架构不会为唯一标识符类型设置默认值。
  • 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 架构进行架构更改?

【问题讨论】:

    标签: microsoft-sync-framework


    【解决方案1】:

    SqlCeSyncProvider 和 SqlCeClientSyncProvider 不同。

    后者是通常所说的离线提供程序,这是 Visual Studio 中本地数据库缓存项目项使用的提供程序。此提供程序与 DbServerSyncProvider 和 SyncAgent 一起使用,并用于中心辐射型拓扑。

    您使用的是协作提供商或点对点提供商(也适用于中心辐射型场景)。 SqlCeSyncProvider 可与 SqlSyncProvider 和 SyncOrchestrator 一起使用,并且没有相应的 Visual Studio 工具支持。

    两个提供商都需要配置参与的数据库。

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

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

    【讨论】:

    • 我发现的 SyncAgent 示例令人望而生畏,看来它需要大量的适配器代码。由于我的日程安排很紧,我最终使用了协作方法,但手动(从脚本)创建了客户端模式。这让我可以设置默认值和约束,然后我配置了客户端但跳过了用户模式。不完美,但让我启动并运行。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 1970-01-01
      • 2019-09-28
      • 2018-05-17
      • 1970-01-01
      • 2016-06-15
      相关资源
      最近更新 更多