Syn c Framework не Provisiong Sql Компактный, когда количество первичных ключей отличается - PullRequest
2 голосов
/ 26 марта 2020

Я пытаюсь синхронизировать c Sql Compact With Sql Server. Все работает нормально, если количество первичных ключей одинаково в таблице клиента и сервера. Но если количество первичных ключей не совпадает в обеих таблицах, я получаю следующее исключение

Указанный ключ отсутствует в словаре.

Трассировка стека :

в System.ThrowHelper.ThrowKeyNotFoundException () в System.Collections.Generi c .Dictionary 2.get_Item(TKey key) at Microsoft.Synchronization.Data.SqlServerCe.SqlCeSyncUtil.GetPkInOrdinalOrder(IEnumerable 1 pkColumns, Dictionary`2 pkIndexOrder) в Microsoft.Synchronization.Data. SqlServerCe.SqlCeSyncTableProvisioning.Apply (SqlCeTransaction транс) в Microsoft.Synchronization.Data.SqlServerCe.SqlCeSyncScopeProvisioning.ApplyInternal (соединение SqlCeConnection) в Microsoft.Synchronization.Data.SqlServerCe.SqlCeSyncScopeProvisioning.Apply () в SQLCompactDeployment.Program.ProvisionClient (String, String ServerConnectionString ClientConnectionString, логический IsSqlServerCompact) в M: \ Windows 2020 \ Documents \ repos \ SQLCompactDeployment \ SQLCompactDeployment \ Program.cs: строка 296

Структура таблицы на сервере

USE [Server]
GO

/****** Object:  Table [dbo].[Customer]    Script Date: 3/26/2020 6:09:31 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Customer](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](150) NULL,
    [TenantId] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_Customer_1] PRIMARY KEY CLUSTERED 
(
    [Id] ASC,
    [TenantId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

Структура таблицы в клиенте * 102 2 *

USE [Client]
GO

/****** Object:  Table [dbo].[Customer]    Script Date: 3/26/2020 6:09:20 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Customer](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](150) NULL,
    [TenantId] [uniqueidentifier] NOT NULL,
 CONSTRAINT [PK_Customer_1] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

Код синхронизации

public static bool ProvisionServer(string ServerConnectionString)
{
    try
    {
        string scopeName = "SyncScope";
        SqlConnection serverConn = new SqlConnection(ServerConnectionString);
        DbSyncScopeDescription SyncScope = new DbSyncScopeDescription(scopeName);
        DbSyncTableDescription Customer = SqlSyncDescriptionBuilder.GetDescriptionForTable("Customer", serverConn);
        SyncScope.Tables.Add(Customer);
        SqlSyncScopeProvisioning serverProvision = new SqlSyncScopeProvisioning(serverConn, SyncScope);
        serverProvision.SetCreateTableDefault(DbSyncCreationOption.Skip);
        serverProvision.Apply();
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}

public static bool ProvisionClient(string ServerConnectionString, string ClientConnectionString, bool IsSqlServerCompact)
{
    try
    {
        string scopeName = "SyncScope";
        SqlConnection serverConn = new SqlConnection(ServerConnectionString);
        DbSyncScopeDescription scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope(scopeName, serverConn);
        if (IsSqlServerCompact)
        {
            SqlCeConnection clientConnCe = new SqlCeConnection(ClientConnectionString);
            SqlCeSyncScopeProvisioning clientProvision = new SqlCeSyncScopeProvisioning(clientConnCe, scopeDesc);
            clientProvision.Apply();
        }
        else
        {
            SqlConnection clientConn = clientConn = new SqlConnection(ClientConnectionString);
            SqlSyncScopeProvisioning clientProvision = new SqlSyncScopeProvisioning(clientConn, scopeDesc);
            clientProvision.Apply();
        }
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }

}

С той же структурой Если я синхронизирую c Из Sql базы данных сервера до Sql база данных сервера работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...