Ответ 1
Взгляните на это: fooobar.com/questions/121030/... - инфраструктура сущности может предполагать, что поле CategoryId является личным идентификатором и, следовательно, передает null в базу данных, ожидая ее заполнения это для вас.
Извините за мой английский.
Я пишу свой проект, используя 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;
}
Скажите, пожалуйста, что происходит? Спасибо за любую помощь!
Взгляните на это: fooobar.com/questions/121030/... - инфраструктура сущности может предполагать, что поле CategoryId является личным идентификатором и, следовательно, передает null в базу данных, ожидая ее заполнения это для вас.
Я столкнулся с этим сегодня и должен был восстановить мои классы EF из базы данных.
После этого я обнаружил, что EF добавил:
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
в это поле "ИД", которое раньше являлось столбцом Identity в SQL, но было изменено на назначение приложения.
Я думаю, что если у вас нет этого атрибута, EF фактически не отправит идентификатор в базу данных ( "соглашение по конфигурации" )
Я создал таблицу с int Id как PK, но забыл установить "Identity Specification" = True
Попробуйте добавить это в файл .cs вашего класса модели:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CategoryId { get; set; }
Или измените свой столбец CategoryId на идентичность:
CategoryId int IDENTITY(1,1)
Встретил ту же проблему сегодня.
Вот как я понял проблему.
Сначала я добавил семя идентификаторов в столбец, но после этого удалил его. Поэтому я не осознавал, что при изменении определения столбца в коде сначала идентификатор
Свойство (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);
Для меня у меня была другая схема, отличная от схемы по умолчанию. Название Id-ключа было как-то пропущено в той части схемы - исправлено в базе данных, и все прошло хорошо. Как это было;
PK_TableName
Как я изменил это на
PK_mySchema.TableName