IDENTITY INSERT и LINQ to SQL

У меня есть база данных SQL Server. В этой базе данных есть таблица под названием Item. Элемент имеет свойство "ID". ID - это первичный ключ на моем столе. Этот первичный ключ - это int с инкрементным значением 1. Когда я пытаюсь вставить запись, я получаю сообщение об ошибке:

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

Я пытаюсь вставить записи, используя следующий код:

  public int AddItem(Item i)
  {
    try
    {
      int id = 0;
      using (DatabaseContext context = new DatabaseContext())
      {
        i.CreatedOn = DateTime.UtcNow;
        context.Items.InsertOnSubmit(i);
        context.SubmitChanges();
        id = i.ID;
      }
      return id;
    }
    catch (Exception e)
    {
      LogException(e);
    }
  }

Когда я смотрю на i.ID перед отправкой, я замечаю, что i.ID установлен в 0. Это означало бы, что я пытаюсь вставить 0 в качестве идентификатора. Однако я не уверен, что это должно быть. Может кто-нибудь помочь мне?

Спасибо!

Ответы

Ответ 1

Звучит просто так, как будто ваша модель не знает о том, что это личность; столбец ID должен быть помечен как db-сгенерированный (Auto Generated Value в пользовательском интерфейсе или IsDbGenerated в xml) и, вероятно, в качестве первичного ключа. Затем он не будет пытаться вставить его и будет правильно обновлять значение после его написания.

Ответ 2

Установите для свойства "Автогенерация" свойства ID значение "Истина".

Ответ 3

Проверьте свойство ID внутри класса Item, чтобы убедиться, что у него есть такие атрибуты:

[Column(Storage="_ID", AutoSync=AutoSync.OnInsert,
    DbType="INT NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]

Посмотрите на IsDbGenerated=true, это важный парень здесь.

Возможно, вы создали конструктор DatabaseContext, используя конструктор, прежде чем настраивать IDENTITY на сервере Sql, чтобы просто восстановить этот класс (удалив таблицу в конструкторе и снова отбросив ее из Server Explorer).

Ответ 4

Идентификатор будет равен нулю, пока вы не вызовете context.SubmitChanges();. Пройдите код и посмотрите на значение после вызова SubmitChanges. Помните, что БД фактически назначает идентификатор (предполагая, что это ключ автоматического увеличения).

Взгляните на это:

Работа с ключами сущностей

Ответ 5

Вы должны определить в своем сопоставлении, что идентификатор создается в базе данных. Способ сделать это зависит от типа используемого вами сопоставления. если вы используете атрибуты кода, убедитесь, что вы указали IsDbGenerated в ColumnAttribute для свойства Id (или в XML-сопоставлении). если вы используете файл dbml, убедитесь, что для параметра Auto Generated Value установлено значение true.

Ответ 6

Самый простой способ: 1. открыть dbml 2. Выберите класс для вставки 3. Выберите столбец с первичным ключом 4. установите флажок "Автоматическое генерируемое свойство в окне свойств" (для него должно быть установлено значение "Истина" )