EF Core ValueGeneratedOnAdd不适用于PostgreSQL

时间:2018-12-02 23:08:49

标签: entity-framework entity-framework-core asp.net-core-2.0 npgsql

Assembly IdentityServer4.EntityFramework.Storage使用ConfigurationDbContext时

使用IdentityServer4.Models.Client实体播种数据库 enter image description here

我收到以下错误: PostgresException:23502:“ Id”列中的空值违反了非空约束

我看了看数据库,结果发现该列的类型为integer,尽管我希望它是serialenter image description here

下面您可以看到部分迁移代码,它们负责创建列:

 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, 在ValueGeneratedOnAdd()列上调用integer应该导致数据库中的serial类型。

对此有何看法?

2 个答案:

答案 0 :(得分:0)

更改

.Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn)

.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.SerialColumn)

解决了这个问题。

答案 1 :(得分:0)

通用提供程序的扩展方法。

public static void HasIdentityAnnotation<T>(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);
}