Проблема Microsoft Sync Framework при синхронизации реляционной базы данных - PullRequest
2 голосов
/ 21 января 2010

Я пытаюсь использовать 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 конфликтует с ССЫЛОЧНОЕ ограничение "FK_Employees_Departments". конфликт произошел в базе данных "Sync_Client", таблица "dbo.Employees", столбец DepartmentID.

Кто-нибудь знает, как это можно исправить. То, что я думаю, каркас синхронизации не может обеспечить свойство выполнения изменений в правильном порядке. Этот порядок зависит от нескольких факторов, таких как отношения внешних ключей, тип команды, например, вставить, обновить и т. д. Я действительно застрял здесь. Ранняя помощь будет оценена.

1 Ответ

4 голосов
/ 21 июня 2011

Это старый вопрос сейчас, но реального ответа нет:

Синхронизация требует, чтобы вы перечисляли таблицы в каждой области в порядке вставки, чтобы все родительские элементы внешнего ключа были на месте до того, как будут вставлены любые дочерние ключи внешнего ключа. Синхронизация автоматически отменяет этот порядок при удалении.

Это все хорошо, но если у вас есть база данных, в которой по какой-либо причине данные в ваших родительских или дочерних таблицах хранятся на разных серверах на основе некоторой независимой части информации, так что родитель и потомок могут иметь разные правила синхронизации, вы превысили любую доступную автоматическую обработку.

В этом случае, когда обычные фильтры синхронизации создаются на основе информации о первичном ключе в ваших таблицах BASE, вам нужно будет заставить фильтры использовать информацию о первичном ключе в таблицах TRACKING. Теперь на сайте social.msdn.microsoft.com есть некоторый контент.

...