Entity Framework Core: вычисляемый столбец с постоянными значениями - PullRequest
0 голосов
/ 29 октября 2018

Я немного удивлен, что не нашел никакой информации по следующему вопросу, поэтому прошу прощения, если я пропустил это где-то в документах. Использование SQL Server (локально и в Azure 2016) и кода EFCore Сначала мы пытаемся создать столбец вычисляемой таблицы с постоянным значением. Создание столбца работает нормально, но я понятия не имею, как сохранить значение. Вот что мы делаем:

modelBuilder.Entity<SomeClass>(entity =>
{
    entity.Property(p => p.Checksum)
        .HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName]))");
});

А вот что мы хотели бы получить в T-SQL:

CREATE TABLE [dbo].[SomeClass]
(
    [FirstColumnName]   [NVARCHAR](10)
  , [SecondColumnName]  [NVARCHAR](10)
  , [Checksum] AS (CHECKSUM([FirstColumnName], [SecondColumnName])) PERSISTED
);

Кто-нибудь может указать мне правильное направление?

Заранее спасибо, Тоби

ОБНОВЛЕНИЕ: Основываясь на хорошей идее @ jeroen-mostert, я также попытался просто пропустить строку PERSISTED как часть формулы:

modelBuilder.Entity<SomeClass>(entity =>
{
    entity.Property(p => p.Checksum)
        .HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName]) PERSISTED)");
});

А также за скобками:

modelBuilder.Entity<SomeClass>(entity =>
{
    entity.Property(p => p.Checksum)
        .HasComputedColumnSql("(checksum([FirstColumnName], [SecondColumnName])) PERSISTED");
});

Однако, как ни удивительно, вычисляемый столбец все еще генерируется с Is Persisted = No, поэтому строка PERSISTED, похоже, просто игнорируется.

1 Ответ

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

Пройдя некоторое чтение и несколько тестов, я попробовал PERSISTED внутри SQL-запроса, и это сработало.

entity.Property(e => e.Duration_ms)
      .HasComputedColumnSql("DATEDIFF(MILLISECOND, 0, duration) PERSISTED");

Сгенерированная миграция была следующей:

migrationBuilder.AddColumn<long>(
            name: "duration_ms",
            table: "MyTable",
            nullable: true,
            computedColumnSql: "DATEDIFF(MILLISECOND, 0, duration) PERSISTED");

Чтобы проверить в базе данных, действительно ли она сохраняется, я запустил следующее:

select is_persisted, name from sys.computed_columns where is_persisted = 1

и столбец, который я создал, находится там.

...