Почему EF пытается вставить NULL в id-столбец? - PullRequest
19 голосов
/ 13 января 2012

Извините за мой английский.

Я пишу свой проект, используя Entity Framework 4.0 (сначала модель). В начале проекта я столкнулся с этой проблемой: я пытаюсь вставить заполненный объект в базу данных, но получаю исключение:

"Невозможно вставить значение NULL в столбец« CategoryId », таблица« ForumDB.dbo.Categories »; столбец не допускает пустые значения. INSERT завершается неудачно. Оператор завершен."

    Category usingCategory = new Category("Using Forums", "usingforums", 0);
    using (Context)
    {
        Context.Categories.AddObject(usingCategory);
        Context.SaveChanges();
    }

Я проверил этот объект, и я уверен, что он заполнен.

На всякий случай:

public Category(string name, string urlName, int index)
{
    CategoryId = Guid.NewGuid();
    Name = name;
    UrlName = urlName;
    CategoryIndex = index;
}

Пожалуйста, скажите мне, что происходит? Спасибо за любую помощь!

Ответы [ 6 ]

38 голосов
/ 13 января 2012

Посмотрите на это: https://stackoverflow.com/a/5338384/171703 - структура сущностей может предполагать, что ваше поле CategoryId является идентификатором, и, следовательно, передавать значение null в базу данных, ожидая, что оно заполнит его для вас.

27 голосов
/ 07 февраля 2017

Я столкнулся с этим сегодня и должен был восстановить мои классы EF из базы данных.

После этого я обнаружил, что EF добавил:

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }

в это поле "Id"Раньше это был столбец Identity в SQL, но он был изменен для присвоения приложению.

Я думаю, что если у вас нет этого атрибута, EF фактически не отправит идентификатор в базу данных («соглашение по конфигурации»)

5 голосов
/ 03 апреля 2017

Я создал таблицу с int Id в качестве PK, но забыл установить «Identity Specification» = True

2 голосов
/ 02 августа 2018

Попробуйте добавить это в файл .cs вашего класса модели:

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int CategoryId { get; set; }

Или измените свой столбец CategoryId на идентичность:

    CategoryId int IDENTITY(1,1)
0 голосов
/ 17 апреля 2019

Для меня у меня была другая схема, отличная от схемы по умолчанию.Название Id-ключа было как-то пропущено в той части схемы - исправлено в базе данных, и все прошло хорошо.Как это было;

PK_TableName

Как я изменил его на

PK_mySchema.TableName
0 голосов
/ 27 июня 2018

Сегодня встретился с той же проблемой.

Вот как я выяснил проблему.

Сначала я добавил семя идентификаторов в столбец, но после этого удалил его.Поэтому я не осознавал, что при первом изменении определения столбца в коде свойство Id

(x => x.Id) .HasColumnName (@ "Id"). HasColumnType ("int") .IsRequired ();

Итак, платформа Entity выяснила, что это столбец Identity, и я получил исключение выше.

Чтобы исправить это, добавили « HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None)", поэтому последний фрагмент был примерно таким:

Свойство (x => x.Id) .HasColumnName (@" Id ") .HasColumnType ( "ИНТ") требуется копаться () HasDatabaseGeneratedOption (System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None)..

...