Как изменить схему клиента во время инициализации? - PullRequest
1 голос
/ 14 октября 2011

Я тороплюсь (что никогда не бывает хорошо), чтобы настроить Sync Framework и запустить его для крайнего срока "автономной поддержки" в моем проекте.У нас есть экземпляр SQL Express 2008 на нашем сервере, а затем мы развернем SQLCE на клиентах.Клиенты будут синхронизироваться только с сервером, без одноранговой сети.

Пока у меня работает следующее:

  1. Настройка схемы сервера
  2. Область создана и протестирована
  3. Сервер подготовлен
  4. Клиент подготовлен с созданием таблицы

Я был очень впечатлен относительной простотой всего этого.Затем я понял следующее:

  • Схема, созданная посредством обеспечения клиента SQLCE, не устанавливает значения по умолчанию для типов уникальных идентификаторов.
  • Ограничения FK не создаются на клиенте

Вот код, который используется для создания клиентской схемы (взят из примера, который я нашел где-то в Интернете)

static void Provision()
{
    SqlConnection serverConn = new SqlConnection(
        "Data Source=xxxxx, xxxx; Database=xxxxxx; " +
            "Integrated Security=False; Password=xxxxxx; User ID=xxxxx;");

    // create a connection to the SyncCompactDB database
    SqlCeConnection clientConn = new SqlCeConnection(
        @"Data Source='C:\SyncSQLServerAndSQLCompact\xxxxx.sdf'");

    // get the description of the scope from the SyncDB server database
    DbSyncScopeDescription scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope(
        ScopeNames.Main, serverConn);

    // create CE provisioning object based on the scope
    SqlCeSyncScopeProvisioning clientProvision = new SqlCeSyncScopeProvisioning(clientConn, scopeDesc);
    clientProvision.SetCreateTableDefault(DbSyncCreationOption.CreateOrUseExisting);

    // starts the provisioning process
    clientProvision.Apply();
}

Когда Sync Framework создает схему на клиенте, мне нужно сделать дополнительныеИзменения, перечисленные ранее (значения по умолчанию, ограничения и т.Событие CreateSchema.Этот пример кода на самом деле показывает установку свойства RowGuid для столбца, что именно то, что мне нужно сделать.Однако, что такое SqlCeClientSyncProvider ?!Все это время (4 дня) я работаю с SqlCeSyncProvider в моем коде синхронизации.Итак, есть SqlCeSyncProvider и SqlCeClientSyncProvider?

Документация по MSDN не очень хороша для объяснения того, что либо из этого.

Я еще больше запутался, следует ли мне вносить изменения в схему во время предоставленияили во время синхронизации?

Как бы вы все предложили мне внести изменения в схему CE клиента во время подготовки?

Ответы [ 2 ]

3 голосов
/ 15 октября 2011

SqlCeSyncProvider и SqlCeClientSyncProvider различаются.

Последний - это то, что обычно называют автономным поставщиком, и это поставщик, используемый элементом проекта Local Database Cache в Visual Studio.Этот провайдер работает с DbServerSyncProvider и SyncAgent и используется в топологиях со спицами-концентраторами.

Тот, кого вы используете, называется провайдером для совместной работы или одноранговым провайдером (который также работает в хабе).сценарий).SqlCeSyncProvider работает с SqlSyncProvider и SyncOrchestrator и не имеет соответствующей поддержки инструментов Visual Studio.

Оба провайдера требуют предоставления участвующих баз данных.

Два типа провайдеров предоставляют объекты синхронизации, необходимые для отслеживания и применения изменений.по-другому.Событие SchemaCreated применяется только к автономному поставщику.Этот метод запускается при первом запуске синхронизации и когда платформа обнаруживает, что клиентская база данных не была подготовлена ​​(создайте пользовательские таблицы и соответствующие объекты инфраструктуры синхронизации).

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

1 голос
/ 15 октября 2011

При исследовании решений без использования SyncAgent я обнаружил, что также будет работать следующее (в дополнение к моему вышеупомянутому решению с комментариями):

  1. Предоставьте клиенту и дайте фреймворку создать схему client [user]. Теперь у вас есть ваши столы.
  2. Deprovision - это снимает ограничения на редактирование таблиц / столбцов
  3. Внесите изменения (в моем случае это настройка Is RowGuid для столбцов PK и добавление ограничений FK) - для этого фактически потребовалось, чтобы я удалил и добавил столбец, поскольку вы не можете изменить свойство Is RowGuid для существующих столбцов
  4. Предоставить снова, используя DbSyncCreationOption.CreateOrUseExisting
...