Код EF Сначала дайте мне ошибку Невозможно вставить явное значение для столбца идентификатора в таблице "Люди", если для параметра IDENTITY_INSERT установлено значение "ВЫКЛ".
Я тестирую Entity Framework 4 Code First (EF CodeFirst 0.8) и сталкиваюсь с проблемой с простой моделью, которая имеет отношение 1 ↔ 0..1 между Person
и Profile
. Вот как они определены:
public class Person
{
public int PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime? DOB { get; set; }
public virtual Profile Profile { get; set; }
}
public class Profile
{
public int ProfileId { get; set; }
public int PersonId { get; set; }
public string DisplayName { get; set; }
public virtual Person Person { get; set; }
}
Контекст DB выглядит следующим образом:
public class BodyDB : DbContext
{
public DbSet<Person> People { get; set; }
}
Я не определял DbSet
для Profile
, потому что считаю, что People
является его совокупным корнем. Когда я пытаюсь добавить новый Person
- даже один без Profile
с этим кодом:
public Person Add(Person newPerson)
{
Person person = _bodyBookEntities.People.Add(newPerson);
_bodyBookEntities.SaveChanges();
return person;
}
Я получаю следующую ошибку:
Невозможно вставить явное значение для столбца идентификации в таблицу "Люди", если для параметра IDENTITY_INSERT установлено значение "ВЫКЛ".
Объект newPerson
имеет свойство 0
для свойства PersonId
, когда я вызываю People.Add()
. Таблицы базы данных People
и Profiles
. PersonId
является PK People
и является идентификатором автоинкремента. ProfileId
является PK Profiles
и является идентификатором автоматической подстановки. PersonId
- это непустой внутренний столбец Profiles
.
Что я делаю неправильно? Я думаю, что придерживаюсь всех правил EF Code First по правилам конфигурации.
Ответы
Ответ 1
Я получаю следующую ошибку: Невозможно вставить явное значение для столбца идентификации в таблице "Люди", если для параметра IDENTITY_INSERT установлено значение "ВЫКЛ".
Я думаю, что IDENTITY_INSERT - это функция автоматического увеличения, которая отключена.
Итак, проверьте поле PersonId в базе данных, чтобы узнать, является ли он идентификатором.
Кроме того, возможно, это также устранит вашу проблему.
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int PersonId { get; set; }
Ответ 2
Это произойдет, если вы выполните следующие шаги:
- Создайте не-идентификационное поле PK в таблице.
- Вывести модель объекта из этой таблицы.
- Вернитесь назад и установите для идентификатора PK значение true.
Модель Entity и база данных не синхронизированы. Освежающая модель исправит его. Я должен был сделать это только вчера.
Ответ 3
Если вы используете EF Code First, то помимо добавления атрибута аннотации [DatabaseGeneratedAttribute (DatabaseGeneratedOption.Identity)] к файлу model.cs, как это предлагали другие, вам также необходимо сделать такое же эффективное изменение на файлы modelMap.cs(плавные инструкции по отображению):
Изменить:
this.Property(t => t.id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
в
this.Property(t => t.id)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
(Я использовал EF Power Tools для генерации моделей сущностей и файлов сопоставления по умолчанию, а затем превратил один столбец Идентификатора в столбец prmary и установил его в IDENTITY на Sql Server, поэтому мне пришлось обновить атрибут и файл сопоставления по умолчанию.)
Если вы не измените его в обоих местах, вы все равно получите ту же ошибку.
Ответ 4
У меня не было этой проблемы , пока я не добавил составной ключ, поэтому, когда у меня было 2 первичных ключа, это произошло с EF 6.x.x
В моем ключевом "Id", который имеет Спецификация идентификатора, установленную в true, мне нужно было добавить
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
Свойства модели сейчас:
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
[Key, Column("Id", Order = 1)]
public int Id { get; set; }
[Key, Column("RanGuid", Order = 2)]
public string RanGuid { get; set; }
Ответ 5
Ситуация напоминает мне ситуацию, с которой я сталкиваюсь с кодом EF Сначала, когда PrimaryKey и ForeignKey являются одним и тем же столбцом.
Нет прямого способа обновить модель, однако тот же эффект может быть достигнут за 2 шага.
- Прокомментируйте профиль ProfileId в профиле. Перекомпилируйте и обновите базу данных.
- Идентификатор профиля Uncomment, добавьте базу данных DatabaseGeneratedAttribute и обновите базу данных еще раз.
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.None), Key]
Ответ 6
В пользу поисковиков: я получил эту ошибку, но вышеупомянутые исправления не помогли. Это было из-за ошибки с моей стороны.
В моих таблицах у меня есть индекс Guid
Первичный ключ (некластеризованный) и int
.
Ошибка при попытке обновить "Почта" с информацией "Блог" в качестве свойства навигации. См. Следующие классы:
public class Blog
{
public Guid BlogId { get; set; }
public int BlogIndex { get; set; }
// other stuff
}
public class Post
{
public Guid PostId { get; set; }
public int PostIndex { get; set; }
// other stuff
public Blog Blog { get; set; }
}
Проблема заключалась в том, что когда я преобразовывал DTO в модели, BlogId менялся на new Guid()
(я сделал ошибку в сопоставлении). Полученная ошибка была такой же, как в этом вопросе.
Чтобы исправить это, мне нужно было проверить правильность данных при вставке (это было не так) и исправить неправильное изменение данных (в моем случае, разбитое отображение).
Ответ 7
Вот решение. Также см. Приложение для дополнительной помощи.
Перейдите к файлу EF ".edmx" → Откройте его → Теперь щелкните правой кнопкой мыши на диаграмме и выберите "Обновить модель из базы данных".
Это исправит это, потому что вы создали PK Identity в своей БД после создания своей EF-модели.
поможет воссоздать описанные выше действия
Ответ 8
Получил эту ошибку в EF6, посмотрел базу данных, и все выглядело правильно, если Identity Specification
установлен на Yes
. Затем я удалил разные миграции и сделал один новый переход с текущих моделей, а затем все начало работать. Самое быстрое решение, так как приложение еще не было в режиме реального времени и все еще находится в разработке.
![введите описание изображения здесь]()
Невозможно вставить явное значение для столбца идентификатора в таблице 'Test', если для параметра IDENTITY_INSERT установлено значение OFF.
Ответ 9
Если вы используете ядро EF и свободный интерфейс, как я, я обнаружил, что утилита Scaffold-DbContext, которую я использовал для создания модели из существующего db, генерирует строку для моего столбца:
entity.Property(e => e.id).ValueGeneratedNever();
После того, как я изменил DB, добавив атрибут IDENTITY в свой id, мне пришлось изменить строку в:
entity.Property(e => e.id).ValueGeneratedOnAdd();
кроме добавления в поле id в моем классе класса [DatabaseGeneratedAttribute(DatabaseGeneratedOption.None), Key]
decorator.
Я даже не уверен, что последнее необходимо. После того, как вы решили с прежним исправлением, я не пытался его удалить.
Ответ 10
В моем случае кажется, что EF не нравится другой тип, чем INT поле идентификатора - мой был BYTE (TINYINT на стороне SQL).
Так как я смог обновить свой проект и изменить его на INT на SQL, после повторного запуска кода обратной инженерии сначала на VisualStudio, ошибка немедленно прекратилась.
Ответ 11
В моем случае кажется, что EF не нравится другой тип, кроме поля идентификатора INT - мой был BYTE (TINYINT на стороне SQL).
У меня тоже была эта ошибка с использованием PK типа tinyint. Это не то, что EF ему не нравится, похоже, что, в отличие от других случаев, вы должны указать, что в вашей конфигурации:
this.Property(t => t.TableID).HasColumnName("TableID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);