我已使用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?
答案 0 :(得分:38)
那些数据注释应该可以解决问题,也许是与PostgreSQL提供程序相关的东西。
根据所使用的数据库提供程序,可能会生成值 客户端由EF或数据库中。如果该值是由...生成的 数据库,然后EF可以在添加实体时分配临时值 在上下文中。这个临时值将被替换为 数据库在
SaveChanges
期间生成的值。
您也可以尝试使用此Fluent Api配置:
modelBuilder.Entity<Foo>()
.Property(f => f.Id)
.ValueGeneratedOnAdd();
但正如我之前所说,我认为这与数据库提供商有关。尝试向数据库添加新行,稍后检查是否为Id
列生成了值。
答案 1 :(得分:9)
首先,你不应该将Fluent Api与数据注释合并,所以我建议你使用下面的一个:
确保您已设置了关键字
modelBuilder.Entity<Foo>()
.HasKey(p => new { p.Name, p.Id });
modelBuilder.Entity<Foo>().Property(p => p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
OR 您也可以使用数据注释来实现它
public class Foo
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key, Column(Order = 0)]
public int Id { get; set; }
[Key, Column(Order = 1)]
public string Name{ get; set; }
}
答案 2 :(得分:5)
对于遇到此问题的人,使用 SQL Server数据库并且即使在int主键上添加以下注释后仍会抛出异常
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
请检查您的SQL,确保您的主键具有&#39; IDENTITY(startValue,increment)&#39;在它旁边,
CREATE TABLE [dbo].[User]
(
[Id] INT IDENTITY(1,1) NOT NULL PRIMARY KEY
)
这将使数据库在每次添加新行时递增id,起始值为1,增量为1。
我不小心忽略了在我的SQL中花了我一个小时的生命, 希望这有助于某人!!!
答案 3 :(得分:2)
像下面这样注释属性
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
要将身份列用于新模型上所有值生成的属性,只需将以下内容放在上下文的 OnModelCreating()中:
builder.ForNpgsqlUseIdentityColumns();
这将创建使所有具有.ValueGeneratedOnAdd()的键和其他属性在默认情况下具有标识。您可以使用ForNpgsqlUseIdentityAlwaysColumns()始终拥有身份,也可以使用UseNpgsqlIdentityColumn()和UseNpgsqlIdentityAlwaysColumn()逐个属性地指定身份。
答案 4 :(得分:0)
将列类型指定为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