Я пытаюсь синхронизировать 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 база данных сервера работает.