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);
}