"Не удается вставить явное значение столбца идентификаторов в таблицу, если параметр Identity INSERT имеет значение OFF" с составным ключом

недавно мы добавили новый " уровень "в нашу базу данных - добавлен ключ" Company_ID", который должен быть выше/перед существующим полем идентификатора ID в таблицах по всей базе данных.

например, если в таблице были поля ID, то теперь у нее есть Company_ID, затем ID, затем поля. Идея заключается в том, что это позволяет ИД автоинкремент для каждого Company_ID значение функции (Company_ID 1 может иметь номер 1, 2, 3 и т. д. ; Company_ID 2 может иметь номер 1, 2, 3, п.)

поле автоматического приращения остается ID. Пример таблицы :

    [dbo].[Project](
      [Company_ID] [int] NOT NULL,
      [ID] [int] IDENTITY(1,1) NOT NULL,
      [DescShort] [varchar](100) NULL,
      [TypeLookUp_ID] [int] NULL,
      [StatusLookUp_ID] [int] NULL,
      [IsActive] [bit] NOT NULL,
    CONSTRAINT [PK_Project] PRIMARY KEY CLUSTERED 
    (
      [Company_ID] ASC,
      [ID] ASC
    )

прежде чем Company_ID был введен, чтобы выполнить CREATE, мы просто заполнили поля DescShort, TypeLookUp_ID, StatusLookUp_ID и IsActive и оставили ID, чтобы он был по умолчанию, возможно, 0.

запись была успешно сохранена, и ID был автоматически заполнен базой данных, а затем использовался для выполнения шоу через представление и так далее.

сейчас, однако, мы хотим установить Company_ID в указанное значение, оставить ID и заполнить поля, как и раньше.

    _db.Project.Add(newProject);
    _db.SaveChanges();

Да, мы хотим указать значение Company_ID. Мы хотим, чтобы идентификатор был автоматически заполнен, как и раньше. Мы получаем сообщение об ошибке :

не удается вставить явное значение для столбца идентификаторов в таблице Project "" когда IDENTITY_INSERT имеет значение OFF

это вызвано указанием Company_ID или полем ID? Ты знаешь, как мы ... может исправить эту проблему?

8 ответов


проблема в ID. Если вы задаете поле как IDENTITY, вы обычно не можете назначить ему значение - свойство IDENTITY помечает его как позволяющее базе данных автоматически назначать возрастающее значение столбцу.

чтобы решить эту проблему, либо удалите свойство automatic IDENTITY из ID (если вы хотите автоматически увеличить его, вы всегда можете сделать это в своем коде обработки-получить наибольшее значение в поле, добавить к нему, а затем назначить это значение), либо перейдите в БД и установите IDENTITY _INSERT в таблице, которая временно позволяет назначать значения полям идентификаторов.

SET IDENTITY_INSERT [yourTableName] ON

--go back and run your C# code>

SET IDENTITY_INSERT [yourTableName] OFF

после сна я нашел это, для кода Visual Studio C#:[DatabaseGenerated(DatabaseGeneratedOption.Identity)]. Это (по моим словам), определено для каждого из моих ID поля, сообщает Visual Studio, что поле является идентификатором и" оставить его в покое " при отправке значений в базу данных. Когда Company_ID происходит первым и имеет значение, сообщая Visual Studio, что поле идентификатора в другом месте позволяет _db.Project.Add(newProject); а то _db.SaveChanges(); функции по мере необходимости. Эта часть ответа предназначена для стороны Visual Studio. Я понимаю требования к SQL IDENTIY_INSERT так что спасибо @matt-thrower, @steve-pettifer и другим, кто внес свой вклад.


то, что сработало для меня, было simple EDMX update. Как я установил Identity раньше, а затем изменил его на auto. Но не обновил Edmx . После обновления он работал нормально.


что сработало для меня в этом случае, это установить атрибут свойства первичного ключа в классе:

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int DepartmentId { get; set; }

IDENTITY_INSERT уже был включен в моей БД.


можете ли вы попробовать 2 вещи и попробовать каждый отдельно?

  • удалить поля первичного ключа для ID и Company_ID
  • возьмите столбец ID в первом порядке

удалить идентификатор из Id или добавить

SET IDENTITY_INSERT [dbo].[Project] ON

обычно идентификатор вставляется без вмешательства пользователя, поэтому вы получаете ошибку, потому что пытаетесь ввести в нее данные. Установка его на позволит вам ввести данные, которые вы хотите или, простой поворот удалить код, где вы вводите данные в ID, если это то, что вам нужно


Ок, у вас уже есть решение... но подумайте, чтобы оставить ID как уникальный первичный ключ и Company_Id как внешний ключ


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

код Sql:

CREATE TABLE [dbo].[annexe1](
[cle] [int] IDENTITY(1,1) NOT NULL,
[tarif] [nvarchar](50) NULL,
[libele] [nvarchar](max) NULL)

Asp.Net код:

InsertCommand = "INSERT INTO [annexe6] ([cle], [tarif], [libele]) VALUES (@cle, @tarif, @libele)"

устранение:

InsertCommand = "INSERT INTO [annexe6] ([tarif], [libele]) VALUES (@tarif, @libele)"