使用EntityFramework Core時,自動增值在PostgreSQL中不起作用

asp.net-core entity-framework-core postgresql

似乎PostgreSQL的自動增量功能似乎不起作用。

我有以下代碼:

namespace project.Models
{
   public class DatabaseModel
   {
       [Key]
       [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
       [Column(Order=1, TypeName="integer")]
       public int ID { get; set; }
   }
 }

當我更新數據庫時(在執行遷移之後),ID列是主鍵而不是自動增量。

當我嘗試向數據庫添加新對象時,我收到以下錯誤:

Microsoft.EntityFrameworkCore.DbContext[1]
  An exception occurred in the database while saving changes.
  Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. ---> Npgsql.PostgresException: 23502: null value in column "ID" violates not-null constraint

誰能幫忙解決這個問題?如何讓密鑰自動遞增?

一般承認的答案

因為您使用特定類型integer創建了列,所以需要為PostgreSQL指定類型為serial ,以便為您生成id。

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


熱門答案

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

要在新模型上為所有值生成的屬性使用標識列,只需將以下內容放在上下文的OnModelCreating()中:

builder.ForNpgsqlUseIdentityColumns();

這將創建make所有具有.ValueGeneratedOnAdd()的鍵和其他屬性默認具有Identity。您可以使用ForNpgsqlUseIdentityAlwaysColumns()始終具有Identity,並且還可以使用UseNpgsqlIdentityColumn()和UseNpgsqlIdentityAlwaysColumn()逐個屬性地指定標識。

postgres efcore值生成



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因