IDENTITY_INSERT отключен

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

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

Я не уверен, почему эта проблема подходит, у меня есть первичный ключ, заданный как идентификатор, и он также настроен на автоматическое увеличение в дизайнере таблицы Visual Studio. Можно ли настроить параметр IDENTITY_INSERT в дизайнере таблиц в Visual Studio? Или есть еще одна проблема, которая может вызвать это.

UPDATE: @Brian. Насколько я могу судить, я не устанавливаю значение явно, вот код, который добавляется в таблицу (ы).

//Add viewer
public void addViewer(ModelStateDictionary modelState, Users user)
{
   var userToAdd = new UserRoles();
   userToAdd.Users = user;

   if (String.IsNullOrEmpty(userToAdd.Users.Username))
   {
      modelState.AddModelError("noName", "Please enter a username for the new Viewer");
   }

   //See if Committee Member already exists
   try
   {
      userToAdd = _db.UserRoles.First(ur => ur.Users.Username == userToAdd.Users.Username);
      modelState.AddModelError("userExists", "A Viewer with that username already exists in the system");
      return;
    }
    catch (Exception e)
    {
       if (modelState.IsValid)
       {
          //Assign Committee Member role
          userToAdd.Role = "Viewer";
          userToAdd.Users = user;
          //Add new Committee Member to User Roles and associated username to Users
          _db.AddToUserRoles(userToAdd);
          _db.SaveChanges();
       }
    }
}

Ответ 1

Казалось бы, ваш код пытается вставить определенное значение в столбец первичного ключа, который определяется как IDENTITY.

Чтобы избежать ошибки - не вставляйте никаких значений! Пусть дескриптор базы данных получает новое значение для строки, которую вы вставляете.

Если вы используете Linq-to-SQL, щелкните соответствующую таблицу в своем визуальном дизайнере и посмотрите на свойства:

alt text http://i39.tinypic.com/bgzs6d.png

"Автоматическое генерируемое значение" должно быть "True" (которое не является значением по умолчанию), а автосинхронизация должна быть "OnInsert" (опять же: не по умолчанию). Кроме того, установите для параметра "Основной ключ" значение true и убедитесь, что "Тип данных сервера" верен - Int NOT NULL IDENTITY (или что-то в этом роде).

Если вам необходимо переопределить поведение по умолчанию (как правило, только в сценариях очистки или одноразовых манипуляций с данными), вы можете включить IDENTITY_INSERT в таблице, например. после этого вы можете вставить любое значение в столбце IDENTITY:

SET IDENTITY_INSERT YourTableName ON

INSERT INTO YourTableName(IdentityColumn) VALUES(5555)

SET IDENTITY_INSERT YourTableName OFF

Это скорее задача задачи очистки/данных - не то, что вы должны делать все время как dev.

Ответ 2

Вы пытаетесь установить значение первичного ключа явно, вероятно, в объекте LINQ; вы пытаетесь сказать, например, вставить 1 в поле первичного ключа, что личность, и LINQ видит это как вставленное значение.

Также, если вы используете LINQ to SQL в типе данных сервера, убедитесь, что он говорит IDENTITY в поле типа данных; если он не говорит IDENTITY, в LINQ может быть ошибка конфигурации.

Ответ 3

Спасибо всем за ваши предложения, я решил решить проблему, выполнив обновление модели. Моя модель была создана до того, как я установил первичный ключ в спецификацию Identity с автоматическим приращением, поэтому, я думаю, все, что ему нужно, это обновление, чтобы это произошло.

Ответ 4

Если вы используете LinQ для SQL.just удалите свою таблицу из .edmx файла, щелкнув правой кнопкой мыши по таблице и выбрав опцию "Удалить из модели". а затем обновите файл .edmx, щелкнув правой кнопкой мыши на файле .edmx и выбрав опцию "Обновить модель из базы данных...".

Его работа для меня... Попробуй..

Ответ 5

У меня была эта проблема и она была решена, удалив столбец идентификатора из модели. Это очистило его прямо.