使用 EF Core 在 Fluent API 中配置实体时,我遇到了一个奇怪的问题。
我的所有实体都有一个EntityCreated
字段,该字段是一个 DateTime 对象,在作为新记录添加到数据库时设置为当前 DateTime。
以下是我设置此默认值的配置代码:
builder.Property(x => x.EntityCreated).HasDefaultValue(DateTime.Now);
问题是,每次添加新记录时,它将使用在数据库中创建第一条记录时使用的第一个 DateTime,而不是使用当前 DateTime。
我很困惑,因为我在提交到数据库之前检查了这个日期时间是否没有在其他任何地方设置,我不确定是否有其他人遇到同样的问题,但我有点挠头,因为我也尝试了其他一些方法,例如:
1) builder.Property(x => x.EntityCreated).HasDefaultValueSql("getdate()");
2) builder.Property(x => x.EntityCreated).HasComputedColumnSql("getdate()");
任何人都可以在这个问题上提供帮助吗?
非常感谢。
我想出了问题。
此配置是错误的,因为这会将默认值设置为应用程序启动的日期和时间:
builder.Property(x => x.EntityCreated).HasDefaultValue(DateTime.Now);
相反,我将迁移恢复到以前的状态(以删除填充字段的配置),并使用以下配置:
builder.Property(x => x.EntityCreated).HasDefaultValueSql("getdate()");
然后,我创建了一个新的迁移并更新了数据库。
这现在已经解决了我的问题。
更新(2023 年 5 月 9 日):
有些人可能不喜欢这种方法,因为我们正在强制实施底层持久性来填充字段。如果你对此不太满意,那么有一个更简单的方法:
public class Property
{
public int Id { get; set; }
public DateTime EntityCreated { get; set; }
// Other properties...
public Property()
{
EntityCreated = DateTime.Now;
}
}
public class PropertyConfiguration : IEntityTypeConfiguration<Property>
{
public void Configure(EntityTypeBuilder<Property> builder)
{
// No need for HasDefaultValueSql here.
}
}
通过在 Property 类的构造函数中设置 EntityCreated
属性,可以确保它在创建新 Property 对象时获取当前日期和时间。这样,您就不必在PropertyConfiguration
类中使用HasDefaultValueSql("getdate()")
。