代码之家  ›  专栏  ›  技术社区  ›  Morten_564834

代码优先自动生成的值未创建相应的数据库逻辑

  •  0
  • Morten_564834  · 技术社区  · 5 年前

    我尝试了这两种属性:

    [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();
    

    在迁移和更新之后,数据库中不会发生任何事情——我希望这里有一个触发器或约束。

    阅读通过 the documentation 它说:

    数据库提供程序可能会自动为某些属性类型设置值生成,但其他提供程序可能要求您手动设置值的生成方式。例如,使用SQL Server时,将自动为guid属性生成值(使用SQL Server顺序guid算法)。但是,如果指定在add上生成datetime属性,则必须为要生成的值设置一种方法。一种方法是配置getDate()的默认值,请参见默认值。

    好吧,但是我怎样才能,首先使用代码,在数据库上建立适当的逻辑呢?我不想在我的模型中创建默认值,因为那样的话,我将依赖于我的API。我以为数据库生成选项可以做些什么……现在,它似乎相当无用。

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

    1 回复  |  直到 5 年前
        1
  •  1
  •   CodeCaster    5 年前

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

    这不是该配置所做的,它指示EF在保存实体时重新加载生成或更新的值。

    如该部分所述,要实现您想要的目标,请参见 Default Values :

    可以使用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()");
          }
      }