3

我正在尝试使用 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”、列“DepartmentID”中。

如果我对表格的顺序进行了一些更改,那么我能够解决由于删除而出现的另一种情况。

DELETE 语句与 REFERENCE 约束“FK_Employees_Departments”冲突。冲突发生在数据库“Sync_Client”、表“dbo.Employees”、列“DepartmentID”中。

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

4

1 回答 1

5

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

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

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

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

于 2011-06-20T20:55:51.110 回答