"Невозможно вставить явное значение для столбца идентификации в таблице, когда IDENTITY_INSERT установлен в OFF" с помощью составного ключа

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

Например, если в таблице были ID-поля, теперь у нее есть идентификатор Company_ID, затем идентификатор, а затем поля. Идея заключается в том, что это позволяет идентификатору автоматически увеличиваться для каждого значения Company_ID, которое предоставляется для функциональности (Company_ID 1 может иметь ID 1, 2, 3 и т.д., Company_ID 2 может иметь ID 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, а left ID - все, что было по умолчанию, возможно, 0.

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

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

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

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

Невозможно вставить явное значение для столбца идентификации в таблице "Проект" когда для параметра IDENTITY_INSERT установлено значение ВЫКЛ

Это вызвано указанием идентификатора Company_ID или поля ID? Вы знаете, как мы можем исправить эту проблему?

Ответ 1

После сна я нашел это для кода Visual Studio С#: [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 и другим, кто внес вклад.

Ответ 2

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

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

SET IDENTITY_INSERT [yourTableName] ON

--go back and run your C# code>

SET IDENTITY_INSERT [yourTableName] OFF

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

SET IDENTITY_INSERT [dbo].[Project] ON

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

Приращение вашего внешнего ключа в вашей таблице 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)"

Ответ 9

Ваш ID должен быть уникальным. Используйте для этого хэш. (например GUID)

[Key]
public string Id { get; set; }

public your_constructor()
{
    Id = Guid.NewGuid().ToString();
}

Ответ 10

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