Entity Framework CTP 4. «Невозможно вставить значение NULL в столбец» - даже если значение NULL отсутствует - PullRequest
49 голосов
/ 15 декабря 2010

Я использую EF CTP 4. У меня есть простое консольное приложение (для тестирования), которое использует EF для вставки некоторых данных в базу данных SQL.

Я столкнулся с проблемой, когда при вставке предмета

using(var context = GetContext())
{
   BOB b = new BOB();
   b.Id = 1;

   context.Bobs.Add(b);
   context.SaveChanges();
}

Выдает ошибку: {"Невозможно вставить значение NULL в столбец" Id ", таблица" TestDB.dbo.BOB "; столбец не допускает нулевые значения. INSERT завершается неудачей. \ R \ nОписание завершено . "}

В таблице только 1 поле: Id int NOT NULL , который является первичным ключом и является , а не автоматически увеличиваемым идентификатором.

При создании DataContext у меня есть эта конфигурация, которая да срабатывает.

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<BOB>().HasKey(b => b.Id);
    builder.Entity<BOB>().MapSingleType().ToTable("BOB");
}

Я также предварительно заполнил эту таблицу, а затем через отладчик смог через watch загрузить этот объект BOB ... так что я действительно в замешательстве, так как я могу загрузить мой BOB показывает, что все в порядке ... однако при вставке нового происходит сбой ...

Ответы [ 7 ]

69 голосов
/ 24 февраля 2011

У меня здесь та же проблема, и это действительно уродливое решение.

 [Key]
public Int64 PolicyID { get; set; }

это НЕ автоматически генерируемый номер

, тогда я сталкиваюсь с той же ошибкой.

EF Code First CTP5

после применения этого:

 [Key]
 [DatabaseGenerated(DatabaseGeneratedOption.None)]
 public Int64 PolicyID { get; set; }

, тогда это будет работать.

28 голосов
/ 15 декабря 2010

Вы пытались явно указать StoreGeneratedPattern?

modelBuilder.Entity<BOB>()
    .HasKey(p => p.Id)
        .Property(p => p.Id)
            .StoreGeneratedPattern = StoreGeneratedPattern.None;

builder.Entity<BOB>().MapSingleType().ToTable("BOB");
26 голосов
/ 17 марта 2011

Я использую EF 4.1, Model First и столкнулся с этой проблемой.Вот как я это решил:

При использовании поверхности конструктора моделей, когда вы создаете сущность, вы должны определить свойство 'Key', по умолчанию используется Id, int32.

В моемВ этой ситуации я решил использовать Guids для Id, поэтому я переключил int32 на Guid.Но если вы изучите этот идентификатор после создания сущности, я обнаружил, что в идентификаторе StoreGeneratedPattern для этого идентификатора был выбран «идентификатор».Сначала я не думал, что это было проблемой, но когда я изучил SQL, используемый для вставки в базу данных, было немного странно, что он не отправлял мой идентификатор. Разочарование!

Но как только я вернулся и изменил «StoreGeneratedPattern» с «identity» на «none», восстановил БД и перестроил проект, это странное {«Cannot»вставьте значение NULL в столбец 'Id', таблица 'TestDB.dbo.BOB'; столбец не допускает нулевые значения. INSERT завершается неудачно. \ r \ nОтношение завершено. "} перестал выполняться.

FYI - при просмотре sql еще кажется, что если у вас выбрано «identity» для «StoreGeneratedPattern», EF сохраняет объект в db (sans Id), а затем сразу же возвращает идентификатор и сохраняет его обратно в ваш объект,то есть этот выбор для StoreGeneratedPattern опирается на БД для генерации вашего идентификатора, НЕ вашего кода!

3 голосов
/ 08 мая 2013

Это случилось со мной, когда у меня отсутствовал первичный ключ в соответствующем столбце (столбце идентификаторов) в схеме базы данных.Я экспортировал данные между серверами SQL, используя инструмент экспорта SSMS и создавая новую базу данных, но не понимал, что она экспортирует только данные без ключей.

1 голос
/ 13 сентября 2018

Вы также можете использовать

modelBuilder.Entity<BOB>()
    .HasKey(p => p.Id)
    .Property(p => p.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

builder.Entity<BOB>().MapSingleType().ToTable("BOB");
0 голосов
/ 03 апреля 2018

У меня была похожая ситуация, но в моем случае даже установка Identity на off не помогла.

Проблема была связана с Первичным ключом, который я пропустил, чтобы добавить в мою сущностьМодель.

Вот скрипт, который генерировал модель:

 CREATE TABLE [im].[SomeGroup]
 (
    [Id] INT NOT NULL IDENTITY(1,1), -- this is mandatory for EF
    [OtherGroupId] INT NOT NULL,
    [Title] NVARCHAR(512) NOT NULL
 )

Код C # для выше:

Insert(new SomeGroup
{
  // I'm not providing Id here, cause it will be auto-generated
  SomeGroupId = otherGroup.Id,
  Title = otherGroup.Title
});

Здесь Также есть какое-то объяснение этому.

0 голосов
/ 07 ноября 2017

Я знаю, что этот вопрос каким-то образом устарел, и приемлемое решение уже найдено, однако я подумал, что будет полезно, если я поделюсь своими выводами.

У меня была эта ошибка сегодня, потому что я использовал два разныхэкземпляры одинаковые DataContext.Я создавал новую модель с некоторыми свойствами - значения для этих свойств были загружены из базы данных, используя один экземпляр DataContext, затем я пытался вставить эту вновь созданную модель в базу данных, вызывая сначала Add(), а затем SaveChanges()на другом экземпляре DataContext.После того, как я начал использовать один и тот же экземпляр как для получения значений для свойств, так и для добавления и сохранения нового объекта - все стало работать.

...