使用Entity Framework Core自动增加部分主键

我使用EF Core fluent API声明了以下模型:

modelBuilder.Entity() .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() .Property(f => f.Id) .ValueGeneratedOnAdd(); 

但正如我之前所说,我认为这与数据库提供商有关。 尝试向数据库添加新行,稍后检查是否为Id列生成了值。

首先,您不应该将Fluent Api与数据注释合并,因此我建议您使用以下其中一项:

确保你有关键设置

 modelBuilder.Entity() .HasKey(p => new { p.Name, p.Id }); modelBuilder.Entity().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; } } 

对于遇到此问题的任何人,即使在int主键上添加以下注释后仍然使用SQL Server数据库并仍然抛出exception

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

请检查您的SQL,确保您的主键旁边有’IDENTITY(startValue,increment)’,

 CREATE TABLE [dbo].[User] ( [Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY ) 

这将使数据库在每次添加新行时递增id,起始值为1,增量为1。

我不小心忽略了我的SQL,这花了我一个小时的生命,所以希望这有助于某人!

注释属性如下

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

要在新模型上为所有值生成的属性使用标识列,只需将以下内容放在上下文的OnModelCreating()中:

 builder.ForNpgsqlUseIdentityColumns(); 

这将创建make所有具有.ValueGeneratedOnAdd()的键和其他属性默认具有Identity。 您可以使用ForNpgsqlUseIdentityAlwaysColumns()始终具有Identity,并且还可以使用UseNpgsqlIdentityColumn()和UseNpgsqlIdentityAlwaysColumn()逐个属性地指定标识。

postgres efcore值生成

将列类型指定为PostgreSQL的串行以生成id。

 [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Column(Order=1, TypeName="serial")] public int ID { get; set; } 

https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL