Подтвердить что ты не робот

Код 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 по правилам конфигурации.

4b9b3361

Ответ 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);