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



我尝试了两个属性:

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

相关内容

最新更新