Вставьте новый объект в контекст с первичным ключом идентификации
Я хочу вставить новую запись в таблицу SQL. Я пробовал:
public void CreateComment(int questionId, string comment)
{
QuestionComment questionComment = context.TableName.Create();//1*
questionComment.propertyThatIsNotAConstraint= questionId;
questionComment.body = comment;
context.QuestionComments.Add(questionComment);
context.SaveChanges();//ERROR...
}
1 * Я удивлен, увидев, что intellisense говорит мне: "Обратите внимание, что новый объект не добавляется или не привязан к набору"
Ошибка чтения:
"Нарушение ограничения PRIMARY KEY" PK_TableName ". Невозможно вставить дублировать ключ в объекте 'dbo.TableName'. Значение повторяющегося ключа (0).\R\nПриложение завершено.
Проблема в том, что questionComment
имеет свой PK: questionComment.Id
по умолчанию 0
. Это должен быть следующий доступный идентификатор или иначе не заполненный и сделать "нормальную" идентификационную вставку.
Как инфраструктура сущности ожидает, что я обработаю этот сценарий?
Как запрошено:
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated from a template.
//
// Manual changes to this file may cause unexpected behavior in your application.
// Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace Feedback.Models
{
using System;
using System.Collections.Generic;
public partial class QuestionComment
{
public int id { get; set; }
public int questionId { get; set; }
public string body { get; set; }
public int commentIndex { get; set; }
}
}
Ответы
Ответ 1
Я исправил его:
-
Перейдите к SQL и убедитесь, что в таблице установлено значение "Идентификация" > "Идентичность" > "Да". Затем обновите файл *.edmx, если вам нужно внести изменения в БД.
-
Проверьте свойства *.edmx > Entity > StoreGeneratedPattern для идентификации, чтобы убедиться, что для него установлено значение Идентификация
![enter image description here]()
Ответ 2
Документация EF гласит, что база данных генерирует значение, когда строка вставлена для столбцов, настроенных с помощью propConfig.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
http://msdn.microsoft.com/en-us/library/hh829109(v=vs.103).aspx
Иными словами. EF не волнует, какое значение newCommentObject.Id
при вставке в базу данных. Вместо этого он позволит базе данных генерировать следующее значение идентификации.