我尝试了两个属性:
[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属性生成值(使用SQL Server顺序GUID算法(。但是,如果指定在添加时生成DateTime属性,则必须设置生成值的方法。一种方法是配置GETDATE((的默认值,请参阅默认值。
好的,但是我如何才能首先使用代码在数据库上生成适当的逻辑。我不想在我的模型中创建默认值,因为那样我将依赖于通过我的API。我认为DatabaseGeneratedOption会有所帮助。。现在它似乎没什么用。
我看到一些帖子在Up((方法中创建了一个触发器,但我并不认为迁移文件夹是放置配置代码的好地方
我希望这里有一个触发器或约束。
该配置不是这样做的,它指示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()"); } }