[C#] Violation de la clé PRIMAIRE (clé en double) sur une table où le PK est l'identité?


Answers

Question

J'ai donc ce tableau:

CREATE TABLE [Snapshots].[Crashproof](
    [EmoteCountId] [int] IDENTITY(1,1) NOT NULL,
    [SnapshotId] [int] NOT NULL,
    [Emote] [nvarchar](42) NOT NULL,
    [EmoteCountTypeId] [int] NOT NULL,
    [Count] [decimal](19, 6) NOT NULL,
    CONSTRAINT [PK_SnapshotsCrashproof] PRIMARY KEY CLUSTERED ([EmoteCountId] ASC) ON [PRIMARY],
    CONSTRAINT [FK_SnapshotsCrashproof_Snapshots] FOREIGN KEY ([SnapshotId]) REFERENCES [Snapshots].[Snapshots] ([SnapshotId]) ON DELETE CASCADE,
    CONSTRAINT [FK_SnapshotsCrashproof_EmoteCountTypes] FOREIGN KEY ([EmoteCountTypeId]) REFERENCES [dbo].[EmoteCountTypes] ([EmoteCountTypeId])
) ON [PRIMARY]
GO

et ce code qui s'y insère:

using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, trans))
{
    bulkCopy.DestinationTableName = "Snapshots.Crashproof";
    bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("SnapshotId", "SnapshotId"));
    bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("EmoteCountTypeId", "EmoteCountTypeId"));
    bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Emote", "Emote"));
    bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping("Count", "Count"));

    using (IDataReader reader = ObjectReader.Create(emoteCountTypesToSnapshot))
    {
        bulkCopy.WriteToServer(reader);
    }
}

il tourne bien 99,99% du temps (et la copie en bloc est faite chaque minute), mais j'ai eu une exception une fois, c'était sur la dernière ligne ( bulkCopy.WriteToServer(reader); ):

Violation de la contrainte PRIMARY KEY ... Impossible d'insérer une clé dupliquée dans l'objet 'Snapshots.Crashproof'. La valeur de la clé en double est (247125).

Je comprends que l'insertion en vrac directement dans la table finale n'est pas recommandée, je vais modifier mon code pour insérer en vrac dans une table de transfert, puis insérer à partir de là. Mais est-ce ce qui a provoqué cette exception?

Je ne comprends vraiment pas comment une clé dupliquée peut apparaître sur un champ Identity: |