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

时间:2018-12-02 13:53:06

标签: c# entity-framework-core

我尝试了两个属性:

def mapper(self,_,line):
        for li in self.db:
            fields=li.split(',')
            yield(fields[0],fields[1])

和Fluent API:

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

迁移和更新后,数据库中什么都没有发生-我希望这里有一个触发器或约束。

通读the documentation时说:

  

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

好的,但是我该如何使用代码优先的方法对数据库进行适当的逻辑处理。我不想在模型中创建默认值,因为那样我将依赖于通过API。我以为DatabaseGeneratedOption会做某事..现在看来相当没用。

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

1 个答案:

答案 0 :(得分:1)

  

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

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