使用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