首页 > 解决方案 > 代码优先自动生成的值未创建相应的数据库逻辑

问题描述

我尝试了这两个属性:

[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; }

和流畅的 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 属性自动生成值(使用 SQL Server 顺序 GUID 算法)。但是,如果您指定在添加时生成 DateTime 属性,那么您必须设置一种生成值的方式。一种方法是配置 GETDATE() 的默认值,请参阅默认值。

好的,但是我如何才能使用代码优先在数据库上创建适当的逻辑。我不想在我的模型中创建默认值,因为那样我将依赖于通过我的 API。我以为 DatabaseGeneratedOption 会做点什么……现在它似乎没什么用。

我看到一些帖子在 Up() 方法中创建了一个触发器,但我并不认为迁移文件夹是放置配置代码的好地方。

标签: c#entity-framework-core

解决方案


我希望这里有一个触发器或约束。

这不是该配置的作用,它指示 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()");
      }
  }

推荐阅读