从Assembly IdentityServer4.EntityFramework.Storage
使用ConfigurationDbContext时
使用IdentityServer4.Models.Client
实体播种数据库
我收到以下错误: PostgresException:23502:“ Id”列中的空值违反了非空约束
我看了看数据库,结果发现该列的类型为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,
在ValueGeneratedOnAdd()
列上调用integer
应该导致数据库中的serial
类型。
对此有何看法?
答案 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);
}