銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

Entity Framework Core で PostgreSQL のAutoIncrement列を使う場合の注意

Entity Framework Core でModel FirstでAutoIncrementな主キーを定義するときはモデルクラスをこのように定義すると思います。

public class ToDo
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public int Id { get; set; }

    [Required, MaxLength(512)]
    public string Description { get; set; }

    public bool Complete { get; set; }
}

sqliteなどはこれでいいのですが、PostgreSQLを使う場合は注意が必要です。dotnet ef migrations add First などでMigrationスクリプトを生成した後にひと手間加えます。

Id = table.Column<int>(nullable: false)
    .Annotation("Autoincrement", true)
    .Annotation("Npgsql:ValueGeneratedOnAdd", true), //この行を追加

主キーのカラムを定義しているスクリプトで、Npgsqlのアノテーションを追加します。これが今後の確定した仕様になるかはわからないのですが、現状はこれを加えないと自動生成=PostgreSQLの場合はカラムをSerial型として定義、が動かず、普通の数値型として定義されてしまいます。詳細はこちらのIssueで議論され、いったんはこれでクローズされています。

github.com