我正在尝试使用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;
}
现在,当我尝试运行同步时,它可以正常使用更新的数据,但是当数据库中有任何插入或删除时,我遇到了外键问题。 e.g。
INSERT语句与之冲突 FOREIGN KEY约束 “FK_Employees_Departments”。该 数据库中发生冲突 “Sync_Client”,表格 “dbo.Departments”,专栏 'DepartmentID的'。
如果我按表格的顺序做一些更改,那么我就可以解决因删除而出现的另一个案例。
DELETE语句与之冲突 REFERENCE约束 “FK_Employees_Departments”。该 数据库中发生冲突 “Sync_Client”,表“dbo.Employees”, 列'DepartmentID'。
有没有人知道如何解决这个问题。我认为同步框架无法以正确的顺序执行更改。这个顺序取决于几个因素,如外键关系,命令类型,例如插入,更新等我真的被困在这里。我们将非常感谢您的早期帮助。
答案 0 :(得分:4)
现在这是一个老问题,但由于没有真正的答案:
同步要求您按插入顺序列出每个范围中的表,以便在插入任何外键子项之前,所有外键父项都已就位。同步将在删除时自动反转该顺序。
这一切都很好,但如果您有一个数据库,无论出于何种原因,父数据库或子表中的数据都会根据某些独立的信息存储在不同的服务器上,这样父母和孩子可能会有所不同同步规则,你已经超越了任何可用的自动处理。
在这种情况下,根据BASE表中的主键信息构建普通同步过滤器,您需要强制过滤器使用TRACKING表中的主键信息。现在有一些关于social.msdn.microsoft.com的内容。