Entity Frameworkコアによる部分的な主キーの自動インクリメント

asp.net c# entity-framework entity-framework-core postgresql

質問

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が一時的な値を割り当てることがあります。この一時的な値は、 SaveChanges中にデータベース生成値に置き換えられます。

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

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

しかし、私が以前に言ったように、これはDBプロバイダーに関連するものだと私は思う。 DBに新しい行を追加し、 Id列の値が生成されたかどうかを後で確認してください。


人気のある回答

まず、Fluent APIとデータ注釈をマージしないでください。次のいずれかを使用することをお勧めします。

あなたが鍵を設定していることを確かめてください

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

または 、データ注釈を使用してそれを達成することもできます

public class Foo
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key, Column(Order = 0)]
    public int Id { get; set; }

    [Key, Column(Order = 1)]
    public string Name{ get; set; }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow