使用Entity Framework Core自動增加部分主鍵

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字段,沒有它對遷移代碼產生任何影響。有沒有辦法製作Id AI雖然它是PPK?

一般承認的答案

那些數據註釋應該可以解決問題,也許是與PostgreSQL提供程序相關的東西。

EF Core文檔

根據所使用的數據庫提供程序,可以通過EF或數據庫在客戶端生成值。如果該值是由數據庫生成的,則在將實體添加到上下文時,EF可以分配臨時值。然後,在SaveChanges期間,此臨時值將由數據庫生成的值替換。

您也可以嘗試使用此Fluent Api配置:

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

但正如我之前所說,我認為這與數據庫提供商有關。嘗試向數據庫添加新行,稍後檢查是否為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