Identity INSERT и LINQ to SQL

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

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

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

  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 перед отправкой я замечаю, что я.ID имеет значение 0. Это означает, что я пытаюсь вставить 0 в качестве идентификатора. Однако я не уверен, что это должно быть. Кто-нибудь может мне помочь?

спасибо!

6 ответов


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


установите для свойства" Auto Generated "свойства ID значение"True".


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

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

посмотреть IsDbGenerated=true, Это важный парень.

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


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

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

работа с ключами сущности


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


самый простой способ-это: 1. открыть dbml 2. Выберите класс для ввода 3. Выберите столбец с первичным ключом 4. проверьте автоматически сгенерированное свойство в окне свойств (оно должно быть установлено в True)