EF Core ValueGeneratedOnAdd 不适用于 postgresql
EF Core ValueGeneratedOnAdd does not work with postgresql
使用来自 Assembly IdentityServer4.EntityFramework.Storage
的 ConfigurationDbContext 时
并使用 IdentityServer4.Models.Client
实体播种数据库
我收到以下错误:PostgresException: 23502: "Id" 列中的空值违反了 not-null 约束
我查看了数据库,发现该列的类型为 integer
,尽管我希望它是 serial
。
您可以在下面看到负责创建列的部分迁移代码:
migrationBuilder.CreateTable(
name: "Clients",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
和
modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.Client", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
基于文档 https://www.npgsql.org/efcore/value-generation.html,
在 integer
列上调用 ValueGeneratedOnAdd()
应该会在数据库中产生 serial
类型。
对此有什么想法吗?
改变
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
至
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn)
已解决问题。
常见提供者的扩展方法。
public static void HasIdentityAnnotation<T>(this PropertyBuilder<T> builder)
{
builder.HasAnnotation("Sqlite:Autoincrement", true)
.HasAnnotation("MySql:ValueGeneratedOnAdd", true)
.HasAnnotation("Npgsql:ValueGenerationStrategy",
Npgsql.EntityFrameworkCore.PostgreSQL.Metadata.NpgsqlValueGenerationStrategy.SerialColumn)
.HasAnnotation("SqlServer:ValueGenerationStrategy", Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.IdentityColumn);
}
使用来自 Assembly IdentityServer4.EntityFramework.Storage
并使用 IdentityServer4.Models.Client
实体播种数据库
我收到以下错误:PostgresException: 23502: "Id" 列中的空值违反了 not-null 约束
我查看了数据库,发现该列的类型为 integer
,尽管我希望它是 serial
。
您可以在下面看到负责创建列的部分迁移代码:
migrationBuilder.CreateTable(
name: "Clients",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn),
和
modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.Client", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
基于文档 https://www.npgsql.org/efcore/value-generation.html,
在 integer
列上调用 ValueGeneratedOnAdd()
应该会在数据库中产生 serial
类型。
对此有什么想法吗?
改变
.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)
至
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn)
已解决问题。
常见提供者的扩展方法。
public static void HasIdentityAnnotation<T>(this PropertyBuilder<T> builder)
{
builder.HasAnnotation("Sqlite:Autoincrement", true)
.HasAnnotation("MySql:ValueGeneratedOnAdd", true)
.HasAnnotation("Npgsql:ValueGenerationStrategy",
Npgsql.EntityFrameworkCore.PostgreSQL.Metadata.NpgsqlValueGenerationStrategy.SerialColumn)
.HasAnnotation("SqlServer:ValueGenerationStrategy", Microsoft.EntityFrameworkCore.Metadata.SqlServerValueGenerationStrategy.IdentityColumn);
}