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), и, вероятно, в качестве первичного ключа. Затем он не будет пытаться вставить его и обновит значение правильно после его записи.
Проверьте 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)