Вычисленный первичный ключ не обновляется в сущности EF Core после вставки - PullRequest
0 голосов
/ 22 октября 2018

У меня есть особый случай, когда Id таблицы определяется как вычисляемый столбец, например:

CREATE TABLE [BusinessArea](
    [Id]  AS (isnull((CONVERT([nvarchar],[CasaId],(0))+'-')+CONVERT([nvarchar],[ConfigurationId],(0)),'-')) PERSISTED NOT NULL,
    [CasaId] [int] NOT NULL,
    [ConfigurationId] [int] NOT NULL,
    [Code] [nvarchar](4) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_BusinessArea] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY]
) ON [PRIMARY]
GO

Обычно, когда у меня есть вычисляемый столбец, я настраиваю его так:

builder.Entity<MyEntity>()
 .Property(p => p.MyComputed).HasComputedColumnSql(null);

При .HasComputedColumnSql() значение MyComputed отражается при вставке / обновлении объекта.

Однако этот прием не работает, если вычисляемый столбец является PK.

Любойидея о том, как заставить это работать также с ПК?

1 Ответ

0 голосов
/ 23 октября 2018

Его можно заставить работать, но только для вставки, установив свойство BeforeSaveBehavior в Игнорировать :

modelBuilder.Entity<BusinessArea>().Property(e => e.Id)
    .Metadata.BeforeSaveBehavior = PropertySaveBehavior.Ignore;

Но в целом такой дизайн будет вызыватьпроблемы с EF Core, потому что он не поддерживает изменяемые ключи (первичные или альтернативные).Это означает, что он никогда не получит обратно Id из базы данных после обновления.Это можно проверить, пометив свойство как ValueGeneratedOnAddOrUpdate (что является нормальным поведением для вычисляемых столбцов):

modelBuilder.Entity<BusinessArea>().Property(e => e.Id)
    .ValueGeneratedOnAddOrUpdate();

Если вы сделаете это, EF Core выдаст InvalidOperationException, говоря

Свойство 'Id' нельзя настроить как 'ValueGeneratedOnUpdate' или 'ValueGeneratedOnAddOrUpdate', поскольку значение ключа нельзя изменить после добавления объекта в хранилище.

...