ValueGeneratedOnAdd не имеет никакого эффекта - PullRequest
0 голосов
/ 17 января 2019

Например, у меня есть следующая таблица:

CREATE TABLE Person (
    id int IDENTITY(1,1) NOT NULL PK,
    firstName nvarchar(20) NOT NULL,
    lastName nvarchar(30) NOT NULL,
    birtdate datetimeoffset(7) NOT NULL,
    age int,
    height int,
)

Существует часть отображения сущности:

public void Configure(EntityTypeBuilder<Person> builder)
{
    ...
    builder.HasKey(k => k.Id);

    builder.Property(k => k.Id)
        .ValueGeneratedOnAdd()
        .IsRequired();
    ...
}

У меня есть сервер MS SQL с этой таблицей на стороне клиента и той же таблицей на стороне сервера. Моя программа получает данные из таблицы на клиенте и отправляет их на сервер, где данные добавляются в базу данных. Нет проблем при получении данных, но когда я пытаюсь вставить данные, я получаю сообщение об ошибке:

SqlException: Cannot insert explicit value for identity column in table 'Person' when IDENTITY_INSERT is set to OFF.

несмотря на .ValueGeneratedOnAdd()

Когда я получаю данные, я получаю сущности с заполненными свойствами Id (1, 2, 3 и т. Д.), Но я думаю, что это не имеет значения.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Я решил добавить UseSqlServerIdentityColumn() в конфигурации свойства Id:

builder.Property(k => k.Id)
    .ValueGeneratedOnAdd()
    .UseSqlServerIdentityColumn()
    ...

Обратите внимание, что это часть SqlServerPropertyBuilderExtensions внутри пакета Microsoft.EntityFrameworkCore.SqlServer .

0 голосов
/ 17 января 2019

Когда я получаю данные, я получаю сущности с заполненными свойствами Id (1, 2, 3 и т. Д.), Но, думаю, это не имеет значения.

На самом деле это имеет значение и является причиной проблемы. ValueGenerated не влияет на свойства, для которых для типа установлено значение, отличное от значения по умолчанию для типа (null для типов, допускающих значение NULL, 0 для числовых типов и т. Д.).

Поведение объясняется в разделе Сгенерированные значения документации EF Core:

Если вы добавляете в контекст сущность, которой присвоено значение свойству, EF будет пытаться вставить это значение, а не генерировать новое. Свойству считается присвоенное значение, если ему не присвоено значение по умолчанию CLR (null для string, 0 для int, Guid.Empty для Guid и т. Д.). Для получения дополнительной информации см. Явные значения для сгенерированных свойств .

Это в основном позволяет разрешать так называемые «вставки идентификаторов» при загрузке данных. Для получения дополнительной информации см. Явные значения в столбцах SQL Server IDENTITY .

С учетом сказанного, если вам не нужно такое поведение, убедитесь, что все свойства вашей сущности Id (PK) установлены на 0, прежде чем вызывать добавление сущности в контекст / набор БД.

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