Ошибка повторяющегося ключа, но при вставке данных через LINQ не найдено ни одной записи с такими же значениями - PullRequest
2 голосов
/ 30 ноября 2011

Я использую C # Linq для взаимодействия с базой данных MSSQL.У меня проблема, когда я иногда получаю сообщение об ошибке:

"Нарушение ограничения PRIMARY KEY 'PK_clustered_key_name'. Невозможно вставить повторяющийся ключ в объект 'dbo.table_name'. Оператор завершен."

Когда я пытаюсь добавить информацию в базу данных.Когда возникает ошибка, я делаю SQL-запрос со значениями, которые пытаюсь добавить, в MSSQL Management Studio, и, похоже, в таблице нет записи.

Так что мой вопрос: есть ли у кого-нибудьподсказка о том, что проблема может быть здесь.Далее следует некоторая дополнительная информация.

Код, который я запускаю (ошибка возникает при SaveChanges), выглядит следующим образом:

table_name table_name_instance = new table_name();
...
fill in values of fps
...

context.table_name.AddObject(fps);

context.SaveChanges();

Я также добавил проверку, если значения col1, col2, col3, col3 уже существуют в базе данных, поэтому я определенно не буду добавлять дубликаты записей.Так как я не уверен, что добавление задерживается и проверка возвращает, что дублирующая запись уже существует, я также добавил добавленные значения в локальный контейнер, просто чтобы быть уверенным, но я все еще получаю ошибку при вызове SaveChanges ().

Ниже приводится определение моей таблицы с кластеризованным ключом, для которого сообщается об ошибке.Col1 - col4 - это все Guid: s, которые являются внешними ключами для других таблиц.

CREATE TABLE [dbo].[table_name](
    [col1] [uniqueidentifier] NOT NULL,
    [col2] [uniqueidentifier] NOT NULL,
    [col3] [uniqueidentifier] NOT NULL,
    [col4] [uniqueidentifier] NOT NULL
 CONSTRAINT [PK_forbandsscenariokrav] PRIMARY KEY CLUSTERED 
(
    [col1] ASC,
    [col2] ASC,
    [col3] ASC,
    [col4] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Я видел много похожих вопросов, но не нашел ответа, который, кажется, применим к моей ситуации.

Дополнительная информация. Я использую MSSQL server 2008 R2 под Win 7 64-bit, а также:

  • Microsoft SQL Server Management Studio 10.50.1600.1
  • Компоненты Microsoft Data Access (MDAC) 6.1.7601.17514
  • Microsoft MSXML 3.0 5.0 6.0
  • Microsoft Internet Explorer 8.0.7601.17514
  • Microsoft .NET Framework 2.0.50727.5448
  • Операционная система 6.1.7601

Обновлено Когда я вместо этого использую функцию Create следующим образом:

table_name table_name_instance = Createtable_name(col_val, col2_val,...);
context.table_name.AddObject(fps);
context.SaveChanges();

Кажется, она работает просто отлично.Дает ли это намек на то, что мое первое решение с новым не работало, даже если я заполнил каждое значение столбца, не принимая ноль со значением?

1 Ответ

0 голосов
/ 30 ноября 2011

Посмотрите, работает ли этот оператор SQL на вашем SQL Server

INSERT INTO [dbo].[table_name]
       ([col1]
       ,[col2]
       ,[col3]
       ,[col4])
VALUES
       (NEWID(),
       NEWID(),
       NEWID(),
       NEWID())
GO

Если это так, это означает, что Guid, который вы создаете из своего приложения, дублируется.Перед вставкой данных в базу данных проверьте, существует ли в таблице первичный ключ, который вы хотите вставить.Вы должны сделать это для каждого столбца, так как каждый столбец является PK.

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