Автоматически сгенерированные в коде значения, не создающие соответствующую логику базы данных - PullRequest
0 голосов
/ 02 декабря 2018

Я попробовал оба атрибута:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreatedDate { get; set; }

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime LastUpdated { get; set; }

И Fluent API:

modelBuilder.Entity<Customer>().Property(b => b.CreatedDate).HasDefaultValue().ValueGeneratedOnAdd();
modelBuilder.Entity<Customer>().Property(b => b.LastUpdated).HasDefaultValue().ValueGeneratedOnAddOrUpdate();
modelBuilder.Entity<Customer>().Property(b => b.Id).HasDefaultValue().ValueGeneratedOnAdd();

После миграции и обновления в базе данных ничего не происходит - я бы ожидал триггера или ограничения здесь.

Читая документацию , в ней говорится:

Поставщики баз данных могут автоматически настраивать генерацию значений для некоторых типов свойств, но другие могут потребовать, чтобы вы вручную настраивали, какзначение генерируется.Например, при использовании SQL Server автоматически генерируются значения для свойств GUID (с использованием алгоритма последовательного GUID SQL Server).Однако, если вы укажете, что свойство DateTime генерируется при добавлении, необходимо указать способ создания значений.Один из способов сделать это - настроить значение по умолчанию для GETDATE (), см. Значения по умолчанию.

Хорошо, но как тогда я могу, используя code-first, создать соответствующую логику в базе данных?,Я не хочу создавать значения по умолчанию в моей модели, потому что тогда я буду зависеть от прохождения моего API.Я думал, что DatabaseGeneratedOption что-то сделает ... сейчас это кажется довольно бесполезным.

Я видел некоторые посты, создающие триггер в методе Up (), но я на самом деле не считаю папку миграции отличнойместо для ввода кода конфигурации.

1 Ответ

0 голосов
/ 02 декабря 2018

Я ожидал бы здесь триггер или ограничение.

Это не то, что делает эта конфигурация, он инструктирует EF перезагрузить сгенерированное или обновленное значение при сохранении сущности.

Для достижения того, что вы хотите, как также объяснено в этом разделе, см. Значения по умолчанию :

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

  class MyContext : DbContext
  {
      public DbSet<Blog> Blogs { get; set; }

      protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          modelBuilder.Entity<Blog>()
              .Property(b => b.Rating)
              .HasDefaultValue(3);
      }
  }

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

  class MyContext : DbContext
  {
      public DbSet<Blog> Blogs { get; set; }

      protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          modelBuilder.Entity<Blog>()
              .Property(b => b.Created)
              .HasDefaultValueSql("getdate()");
      }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...