Entity Framework Core кодирует первые значения по умолчанию для PostgreSQL - PullRequest
0 голосов
/ 14 ноября 2018

Пока что я читаю документы, учебники, которые поднял google, и другие вопросы SO, но, кажется, я что-то упускаю и не понимаю (работает).

Я пытаюсь реализовать действительно крошечный PostgreSQLбаза данных для веб-API .NET Core 2.1 (микросервис).Я привык к первому подходу к базе данных, но для этого сервиса я решил попробовать первый подход к коду.

Я также решил использовать свободный API ModelBuilder, чтобы сохранить классы чистыми от атрибутов и определить большинствоструктуры в методе DbContext.OnModelCreating.Энди, возможно, однажды найдет решение, как сохранить DbContext в чистоте от определенных элементов Postgres и перенести их в миграции ...

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

Например, у меня есть таблица Entity1, в которой только 3 столбца:

  • int Id (идентификатор с автоматическим приращением)
  • bool?IsEnabled (который должен получить значение по умолчанию true)
  • DateTime?LastStatusChange (метка времени без timezonewhich, которая должна быть установлена ​​при создании или обновлении до значения по умолчанию CURRENT_TIMESTAMP)

Идея значения по умолчанию для метки времени заключается в том, чтобы база данных была единственным экземпляром, создающим метки времени и использующим базу данныхзначения по умолчанию в качестве конфигурации для всех запущенных экземпляров.Например.когда требования изменяются на «значение по умолчанию должно теперь быть ложным», мы просто меняем значения по умолчанию в БД в существующих базах данных и обновляем миграцию для новых взносов.

Мой код modelBuilder в настоящее время:

  modelBuilder.Entity<Entity1>(entity =>
  {
    entity.HasKey(e => e.Id);

    entity.Property(e => e.Id)
      .ValueGeneratedOnAdd();

    entity.Property(e => e.IsEnabled)
      .HasDefaultValue(true)
      .ValueGeneratedOnAddOrUpdate();

    entity.Property(e => e.LastStatusChange)
      .HasColumnType("timestamp without time zone")
      .HasDefaultValueSql("CURRENT_TIMESTAMP")
      .ValueGeneratedOnAddOrUpdate();
  });

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

При переключении или сбросе полей я использую

entity.LastStatusChange = null;

и или

entity.IsEnabled = null;

Я предполагал установить их на нольбудет инициировать создание значения по умолчанию, но это не влияет на поле LastStatusChange (значение остается прежним) и устанавливает IsEnabled в значение null.

В любом случае, чтобы получить значения по умолчанию в БД при обновлении через ядро ​​платформы сущностей?

1 Ответ

0 голосов
/ 14 ноября 2018

Как в документах EF Core упоминаются , HasDefaultValue() и HasDefaultValueSql(), которые указывают только то значение, которое устанавливается при вставке новой строки. Установка столбца в ноль - это совершенно другое (в конце концов, ноль является допустимым значением для этих столбцов). Возможно, вы ищете [вычисленные столбцы (https://docs.microsoft.com/en-us/ef/core/modeling/relational/computed-columns),, что является другой функцией.

К сожалению, поскольку в документах Npgsql упоминается , вычисляемые столбцы в настоящее время не поддерживаются PostgreSQL. Это можно настроить с помощью триггеров базы данных PostgreSQL , но EF Core не управляет этим, поэтому вам придется использовать SQL в своих миграциях для настройки.

...