2 つの SQL Server 2005 データベース (サーバーとクライアント) を同期するために Microsoft Sync Framework を使用しようとしています。データベースには複数のテーブルがあり、それらの間に多くの外部キー関係があります。SyncOrchestrator を使用して 2 つのデータベースを同期しています。
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」で競合が発生しました。
これを修正する方法を知っている人はいますか。同期フレームワークは、変更を正しい順序で実行することをプロパティ化できないと思います。この順序は、外部キー関係、挿入、更新などのコマンドの種類などのいくつかの要因に依存します。私は本当にここで立ち往生しています。早期の助けをいただければ幸いです。