Запись в базу данных из LINQ на C#

#c# #linq

#c# #linq

Вопрос:

Я пытаюсь записать некоторый контент в свою базу данных через LINQ. В настоящее время я получаю следующую ошибку:

Cannot insert explicit value for identity column in table 'MyTable' when IDENTITY_INSERT is set to OFF.

Я понимаю, что это проблема, связанная с первичным ключом. В моей таблице для спецификации идентификатора установлено значение «Yes», а для приращения идентификатора — значение «1». Но я успешно обновил другие таблицы, используя код, который выглядит следующим образом:

 using (DataModelDataContext context = new DataModelDataContext())
{
  List<MyTable> newRecords = new List<MyTable>();
  MyTable record1 = new MyTable();
  record1.CreatedBy = GetUserName();
  record1.Information = GetInformation();
  newRecords.Add(record1);

  MyTable record2 = new MyTable();
  record2.CreatedBy = GetUserName();
  record2.Information = GetInformation();
  newRecords.Add(record2);

  context.MyTables.InsertAllOnSubmit(newRecords);
  context.SubmitChanges();
}
  

Что могло бы вызвать эту ошибку? Если я хочу записать новые записи, есть ли способ установить первичный ключ до того, как он будет отправлен в базу данных? Что-то вроде «GetNextKey()» или что-то в этомроде? В принципе, мне просто нужно вставить эти записи. Что я делаю не так?

Спасибо!

Ответ №1:

Опубликованный вами код будет работать, если предположить, что ни одно из этих полей не имеет identity значения. В основном вам нужно убедиться, что вы не пытаетесь установить идентификационное значение, прежде чем добавлять элемент в коллекцию таблиц. (на самом деле, вам никогда не следует устанавливать значение identity из вашего кода в большинстве случаев, когда оно должно быть сгенерировано в БД).

Итак, где-то код, в котором возникает ошибка, пытается установить значение поля identity.

Ответ №2:

Если идентификатор важен (скажем, вы импортируете данные, и записи, которые вы будете вставлять позже, будут ссылаться на эти записи), затем временно отключите идентификатор, пока вы выполняете вставку. Если наличие определенного идентификатора для каждой записи не имеет значения, и вы можете позволить столбцу identity выбрать один (что составляет 99,9 процента времени), убедитесь, что вы не указываете значение для идентификатора, прежде чем пытаться сохранить запись. Также убедитесь, что ваше сопоставление между объектом и базой данных указывает, что идентификатор является идентификатором, поэтому EF знает, что не следует пытаться вставить столбец ID.

Ответ №3:

Убедитесь, что ваш столбец первичного ключа / идентификатора имеет следующий набор в DBML:

  • Автоматически сгенерированное значение: True
  • Автоматическая синхронизация: OnInsert

Это гарантирует, что LINQ-To-SQL не будет пытаться вставить значение ключа в этот столбец и что оно обновит значение после выполнения вставки. Они должны быть включены при добавлении таблицы в DBML.