Сначала код из базы данных - невозможно вставить значение NULL в столбец «Id», но значение на самом деле не равно нулю - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь добавить новую запись:

                 entity.Id = Id;


                _bdc.EquifaxAnswers.Add(entity);

                _bdc.SaveChanges();

, и Id точно определен как первичный ключ, а Id в коде имеет значение (уникальное для таблицы). И EF создает sql код для добавления записи:

 INSERT [dbo].[EquifaxAnswers]([FileName], [dtSend], [dtDateTime], [RecordsAll], [RecordsCorrect], 
[RecordsIncorrect], [ResendedId], [dtEmailAbout], [StartDate], [EndDate])
VALUES (@0, @1, @2, NULL, NULL, NULL, NULL, NULL, @3, @4)

И, как мы видим, Id не существует, поэтому _bdc.SaveChanges(); create Exception:

Ошибка в 25 мс с ошибкой: невозможно вставить значение NULL в столбец «Id», таблица «Equifax.dbo.EquifaxAnswers»; столбец не допускает пустых значений. Ошибка INSERT.

Определение первичного ключа:

    public partial class EquifaxAnswers
{

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

Почему EF не добавляет Id в INSERT и как решить эту проблему?

UPD: Скрипт определения таблицы в базе данных:

CREATE TABLE [dbo].[EquifaxAnswers](
[Id] [int] NOT NULL,
[FileName] [nvarchar](300) NOT NULL,
[dtSend] [datetime] NOT NULL,
[dtDateTime] [datetime] NULL,
[RecordsAll] [int] NULL,
[RecordsCorrect] [int] NULL,
[RecordsIncorrect] [int] NULL,
[ResendedId] [int] NULL,
[dtEmailAbout] [datetime] NULL,
[StartDate] [datetime] NULL,
[EndDate] [datetime] NULL,
CONSTRAINT [PK_EquifaxAnswers] PRIMARY KEY CLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Вы указали DatabaseGeneratedOption.None

Это означает, что EF не ожидает, что база данных сгенерирует поле Id, и что вы должны указать поле Id самостоятельно.

Если вы хотите, чтобы база данных генерировала поле Id автоматически, измените столбец на тип IDENTITY и измените код на DatabaseGeneratedOption.Identity

0 голосов
/ 05 февраля 2020

Решение:

            modelBuilder.Entity<EquifaxAnswers>()
            .Property(a => a.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

Если это не работает - просто удалите и установите снова все пакеты EF (я не знаю почему, но для меня это работа) для всех зависимых проектов, конечно, последняя стабильная версия.

Причины:

По соглашению EF будет считать, что свойства первичный ключ имеют автоматически . Поэтому нам нужно сказать EF, что мы сделаем это с помощью нашего кода. Однако неясно, почему DataAnnotations не работают так:

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

, но свободный API работает хорошо. Возможно, причина в том, что я использую оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...