Entity Framework PostgreSQL 的核心代码优先默认值
Entity Framework Core code first default values for PostgreSQL
到目前为止,我阅读了 google 提出的文档、教程和其他 SO 问题,但似乎我错过了一些东西而且我不明白(工作)。
我尝试为 .NET Core 2.1 web api(微服务)实现一个非常小的 PostgreSQL 数据库。我习惯了数据库优先的方法,但对于这项服务,我决定尝试代码优先的方法。
我还决定使用 ModelBuilder 的流畅 api 来保持 类 属性的干净,并在 DbContext.OnModelCreating 方法中定义大部分结构。安迪也许有一次找到一种解决方案,如何保持 DbContext 不受 Postgres 特定元素的影响,并将它们移动到迁移...
我的问题是要求定义了很多默认值,我无法让它们按应有的方式工作。
例如,我有 table Entity1,它只有 3 列:
- int Id(自增id)
- 布尔? IsEnabled(应获得默认值 true)
- 日期时间? LastStatusChange(没有时区的时间戳应该在创建时设置或更新为默认值CURRENT_TIMESTAMP)
时间戳默认值背后的想法是让数据库成为创建时间戳的单个实例,并使用数据库默认值作为所有 运行 实例的配置。例如。当要求更改为 "the default value should now be false" 时,我们只需更改现有数据库中的数据库默认值并更新更新的迁移。
我的模型构建器代码目前是:
modelBuilder.Entity<Entity1>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.ValueGeneratedOnAdd();
entity.Property(e => e.IsEnabled)
.HasDefaultValue(true)
.ValueGeneratedOnAddOrUpdate();
entity.Property(e => e.LastStatusChange)
.HasColumnType("timestamp without time zone")
.HasDefaultValueSql("CURRENT_TIMESTAMP")
.ValueGeneratedOnAddOrUpdate();
});
这适用于新创建的值。
切换或重置我使用的字段时
entity.LastStatusChange = null;
和或
entity.IsEnabled = null;
我假设将它们设置为 null 会触发默认值的创建,但这不会影响 LastStatusChange 字段(值保持不变)并将 IsEnabled 设置为 null。
通过 entity framework 核心获取更新时的数据库默认值?
作为the EF Core docs mention, HasDefaultValue()
and HasDefaultValueSql()
only specify the value that gets set when a new row is inserted. Setting a column to null is a completely different thing (after all, null is a valid value for those columns). You may be looking for computed columns,这是一个不同的特征。
不幸的是,the Npgsql docs mention, computed columns aren't supported by PostgreSQL at this time. It's possible to set this up using PostgreSQL database triggers,但这不是由 EF Core 管理的,因此您必须在迁移中使用 SQL 来设置它。
PostgreSQL 中 CreateDate 的解决方案:
builder.Property(e => e.CreationDate)
.HasColumnType("timestamp without time zone")
.HasDefaultValueSql("NOW()")
.ValueGeneratedOnAdd();
很遗憾,更新事件没有解决方案。
到目前为止,我阅读了 google 提出的文档、教程和其他 SO 问题,但似乎我错过了一些东西而且我不明白(工作)。
我尝试为 .NET Core 2.1 web api(微服务)实现一个非常小的 PostgreSQL 数据库。我习惯了数据库优先的方法,但对于这项服务,我决定尝试代码优先的方法。
我还决定使用 ModelBuilder 的流畅 api 来保持 类 属性的干净,并在 DbContext.OnModelCreating 方法中定义大部分结构。安迪也许有一次找到一种解决方案,如何保持 DbContext 不受 Postgres 特定元素的影响,并将它们移动到迁移...
我的问题是要求定义了很多默认值,我无法让它们按应有的方式工作。
例如,我有 table Entity1,它只有 3 列:
- int Id(自增id)
- 布尔? IsEnabled(应获得默认值 true)
- 日期时间? LastStatusChange(没有时区的时间戳应该在创建时设置或更新为默认值CURRENT_TIMESTAMP)
时间戳默认值背后的想法是让数据库成为创建时间戳的单个实例,并使用数据库默认值作为所有 运行 实例的配置。例如。当要求更改为 "the default value should now be false" 时,我们只需更改现有数据库中的数据库默认值并更新更新的迁移。
我的模型构建器代码目前是:
modelBuilder.Entity<Entity1>(entity =>
{
entity.HasKey(e => e.Id);
entity.Property(e => e.Id)
.ValueGeneratedOnAdd();
entity.Property(e => e.IsEnabled)
.HasDefaultValue(true)
.ValueGeneratedOnAddOrUpdate();
entity.Property(e => e.LastStatusChange)
.HasColumnType("timestamp without time zone")
.HasDefaultValueSql("CURRENT_TIMESTAMP")
.ValueGeneratedOnAddOrUpdate();
});
这适用于新创建的值。
切换或重置我使用的字段时
entity.LastStatusChange = null;
和或
entity.IsEnabled = null;
我假设将它们设置为 null 会触发默认值的创建,但这不会影响 LastStatusChange 字段(值保持不变)并将 IsEnabled 设置为 null。
通过 entity framework 核心获取更新时的数据库默认值?
作为the EF Core docs mention, HasDefaultValue()
and HasDefaultValueSql()
only specify the value that gets set when a new row is inserted. Setting a column to null is a completely different thing (after all, null is a valid value for those columns). You may be looking for computed columns,这是一个不同的特征。
不幸的是,the Npgsql docs mention, computed columns aren't supported by PostgreSQL at this time. It's possible to set this up using PostgreSQL database triggers,但这不是由 EF Core 管理的,因此您必须在迁移中使用 SQL 来设置它。
PostgreSQL 中 CreateDate 的解决方案:
builder.Property(e => e.CreationDate)
.HasColumnType("timestamp without time zone")
.HasDefaultValueSql("NOW()")
.ValueGeneratedOnAdd();
很遗憾,更新事件没有解决方案。