IDENTITY INSERT и LINQ to SQL - PullRequest
       28

IDENTITY INSERT и LINQ to SQL

13 голосов
/ 26 мая 2011

У меня есть база данных SQL Server.Эта база данных имеет таблицу под названием Item.Элемент имеет свойство под названием «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 перед отправкой, я замечаючто i.ID установлен в 0. Что означало бы, что я пытаюсь вставить 0 в качестве идентификатора. Однако я не уверен, что это должно быть. Может кто-нибудь мне помочь?

Спасибо!

Ответы [ 6 ]

10 голосов
/ 26 мая 2011

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

7 голосов
/ 26 мая 2011

Установите для свойства «Автоматически сгенерированное» свойства ID значение «True».

6 голосов
/ 26 мая 2011

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

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

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

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

2 голосов
/ 26 мая 2011

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

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

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

0 голосов
/ 03 августа 2014

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

0 голосов
/ 26 мая 2011

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

...