1. ホーム
  2. c#

Entity Framework Coreで部分主キーの自動インクリメント

2023-10-04 05:15:13

質問

EF Core fluent APIを使用して、以下のモデルを宣言しました。

modelBuilder.Entity<Foo>()
    .HasKey(p => new { p.Name, p.Id });

PostgreSQLでデータベースを作成する際、両方のフィールドが主キーとしてマークされていますが、Idフィールドは自動インクリメントとしてマークされていません。また

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

をFooの下のIdフィールドに追加しましたが、マイグレーションコード上では何の変化もありません。PPKであるにもかかわらず、IdをAIにする方法はあるのでしょうか?

どのように解決するのですか?

PostgreSQLプロバイダと何か関係があるのかもしれません。

から EF Core ドキュメント :

使用しているデータベースプロバイダによって、値はEFによってクライアント側で生成されるか、データベースで生成されます。 クライアント側でEFによって生成されるか、データベースで生成されます。値がデータベースによって生成される場合 データベースで生成される場合、EF はエンティティをコンテキストに追加するときに一時的な値を割り当てることがあります。 をコンテキストに追加するときに、EF は一時的な値を割り当てます。この一時的な値は の間にデータベースが生成した値に置き換えられます。 SaveChanges .

このFluent Apiの設定でも試すことができます。

modelBuilder.Entity<Foo>()
            .Property(f => f.Id)
            .ValueGeneratedOnAdd();

しかし、先ほども言ったように、これはDBプロバイダに関連する何かだと思います。DBに新しい行を追加して、後で Id カラムに値が生成されたかどうかを後で確認してください。