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. установите флажок "Автоматическое генерируемое свойство в окне свойств" (для него должно быть установлено значение "Истина" )