2010-01-21 128 views
2

我试图使用Microsoft同步框架同步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语句冲突与 外键约束 “FK_Employees_Departments”。该 冲突发生于数据库 “Sync_Client”,表 “dbo.Departments”,列 'DepartmentID的'。

如果我按照表格的顺序做一些改变,那么我能够解决一个由于删除而出现的另一种情况。

DELETE语句冲突与 的REFERENCE约束 “FK_Employees_Departments”。该 冲突发生于数据库 “Sync_Client”,表 “dbo.Employees”, 列 'DepartmentID的'。

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

+0

你有没有得到这个工作,因为我也做的完全一样,你是和具有与FK同样的问题。期待你的回复。 – Belliez 2010-04-09 15:24:33

+0

@Belliez,解决此问题的唯一方法是使用级联删除。这里是另一个线程,我发布在mdsn论坛 - http://social.microsoft.com/Forums/en-US/syncdevdiscussions/thread/0e8464a4-41a5-4897-b3d2-f14a0cf5d4b1 – 2010-04-12 04:11:00

回答

4

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

同步需要列出的插入顺序每个范围表,使所有的外键的父母都在地方的任何外键的孩子之前插入。同步将在删除时自动反转该顺序。

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

在这种情况下,如果正常的同步过滤器对您的基表的主键信息构建,你将需要强制过滤器使用的跟踪表,而不是主键信息。现在在social.msdn.microsoft.com上有关于此的一些内容。

+0

+1“同步需要你列出插入顺序中每个范围中的表格“。在MS论坛上也看到你的帖子。太糟糕了,至今仍然没有答案。 – Jake 2011-12-06 05:53:03