同步关系数据库时出现 Microsoft Sync 框架问题

Posted

技术标签:

【中文标题】同步关系数据库时出现 Microsoft Sync 框架问题【英文标题】:Microsoft Sync framework issue while synchronizing relational database 【发布时间】:2010-01-21 11:28:57 【问题描述】:

我正在尝试使用 Microsoft Sync Framework 来同步 2 个 SQL Server 2005 数据库(服务器和客户端)。数据库中有多个表,它们之间有很多外键关系。我正在使用 SyncOrchestrator 来同步两个数据库。

string clientConnectionString = "<connection string>";
string serverConnectionString = "<connection string>";

SqlSyncProvider localProvider 
    = ConfigureClientProvider(clientConnectionString);
SqlSyncProvider remoteProvider 
    = ConfigureServerProvider(serverConnectionString);

SyncOrchestrator orchestrator = new SyncOrchestrator();
orchestrator.LocalProvider = localProvider;
orchestrator.RemoteProvider = remoteProvider;
orchestrator.Direction = SyncDirectionOrder.Download;

在函数 ConfigureClientProvider 和 ConfigureServerProvider 中,我正在初始化连接并检查范围是否不存在然后创建它:

public static SqlSyncProvider ConfigureClientSyncProvider()

    SqlSyncProvider provider = new SqlSyncProvider();   

    provider.Connection = new SqlConnection(Configs.ConnectionString);


    DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription("Test1");

    SqlSyncScopeProvisioning serverConfig = new SqlSyncScopeProvisioning();

    if (!serverConfig.ScopeExists("Test1", (System.Data.SqlClient.SqlConnection)provider.Connection))
    
        scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable
            ("Employees", (SqlConnection)provider.Connection));
        scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable
            ("Profiles", (SqlConnection)provider.Connection));
        scopeDesc.Tables.Add(SqlSyncDescriptionBuilder.GetDescriptionForTable
            ("Department", (SqlConnection)provider.Connection));


        serverConfig.PopulateFromScopeDescription(scopeDesc);

        serverConfig.SetCreateTableDefault(DbSyncCreationOption.Skip);

        serverConfig.Apply((System.Data.SqlClient.SqlConnection)provider.Connection);
    

    return provider;

现在,当我尝试运行同步时,它对于更新的数据工作正常,但是当数据库中有任何插入或删除时,我遇到了外键问题。例如

INSERT 语句与 FOREIGN KEY 约束 “FK_Employees_Departments”。这 数据库发生冲突 “Sync_Client”,表 “dbo.Departments”,栏目 '部门ID'。

如果我对表格的顺序进行一些更改,那么我能够解决一个案例,另一个案例是由于删除而出现的。

DELETE 语句与 REFERENCE 约束 “FK_Employees_Departments”。这 数据库发生冲突 "Sync_Client", 表 "dbo.Employees", “部门 ID”列。

有没有人知道如何解决这个问题。我认为同步框架无法以正确的顺序执行更改。此顺序取决于几个因素,例如外键关系、命令类型,例如插入,更新等。我真的被困在这里。早期帮助将不胜感激。

【问题讨论】:

你得到这个工作了吗,因为我也和你一样做,FK也有同样的问题。期待您的回复。 @Belliez,解决此问题的唯一方法是使用级联删除。这是我在 mdsn 论坛上发布的另一个帖子 - social.microsoft.com/Forums/en-US/syncdevdiscussions/thread/… 【参考方案1】:

这是一个老问题了,但由于没有真正的答案:

同步要求您按插入顺序列出每个范围内的表,以便在插入任何外键子项之前所有外键父项都已就位。同步将在删除时自动反转该顺序。

这一切都很好,但如果你有一个数据库,无论出于何种原因,你的父表或子表中的数据都基于一些独立的信息存储在不同的服务器上,这样父子表可能会有不同的同步规则,您已经超越了任何可用的自动处理。

在这种情况下,正常同步过滤器是针对 BASE 表中的主键信息构建的,您需要强制过滤器使用 TRACKING 表中的主键信息。现在 social.msdn.microsoft.com 上有一些关于此的内容。

【讨论】:

+1 表示“同步要求您按插入顺序列出每个范围内的表”。在 MS 论坛上也看到了您的帖子。太糟糕了,直到现在它仍然没有答案。

以上是关于同步关系数据库时出现 Microsoft Sync 框架问题的主要内容,如果未能解决你的问题,请参考以下文章

在移动客户端上使用 Microsoft Sync Framework 进行慢速 SQL 同步

Microsoft Sync Framework 1.0 RTM发布了

Microsoft Sync Framework 2.1 中的 CONSTRAINTEXCEPTION 问题

Microsoft Sync Framework 2.1 的状态如何

如何将参数传递给 Microsoft Sync 2.1 生成的存储过程

还原数据库时出现 Microsoft SQL Server 2008 错误