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

Почему EF пытается вставить NULL в id-column?

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

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

"Невозможно вставить значение NULL в столбец" CategoryId ", в таблице" ForumDB.dbo.Categories ", столбец не разрешает значения NULL. 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;
}

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

4b9b3361

Ответ 1

Взгляните на это: fooobar.com/questions/121030/... - инфраструктура сущности может предполагать, что поле CategoryId является личным идентификатором и, следовательно, передает null в базу данных, ожидая ее заполнения это для вас.

Ответ 2

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

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

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

в это поле "ИД", которое раньше являлось столбцом Identity в SQL, но было изменено на назначение приложения.

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

Ответ 3

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

Ответ 4

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

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

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

    CategoryId int IDENTITY(1,1)

Ответ 5

Встретил ту же проблему сегодня.

Вот как я понял проблему.

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

Свойство (x => x.Id).HasColumnName(@"Id"). HasColumnType ("int"). IsRequired();

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

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

Свойство (x => x.Id).HasColumnName(@"Id"). HasColumnType ("int"). IsRequired(). HasDatabaseGeneratedOption (System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);

Ответ 6

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

PK_TableName

Как я изменил это на

PK_mySchema.TableName