首页 > 解决方案 > 23502:“id”列中的空值违反 postgreSQL 中的非空约束

问题描述

我用主键创建了一个表。

我尝试使用 entityframework6 插入新数据,但会出现 23502 错误。

但是我在插入之前将默认值添加到列中。

我不明白为什么会出现这个错误。

表 DDL:

CREATE TABLE ERRORLOG(
id numeric NOT NULL,
message varchar(50) NULL,
CONSTRAINT pterrorlog_pk PRIMARY KEY (id)
);

模型:

public partial class ERRORLOG
{
    [Key]
    [Column(Order = 0)]
    public long ID { get; set; } = DateTimeOffset.Now.ToUnixTimeMilliseconds();
    public string MESSAGE { get; set; }
}

功能:

using (DbContext Db as new DbContext)
using (TransactionScope transactionScope = new TransactionScope())
{
    ERRORLOG iLog = new ERRORLOG();
    iLog.MESSAGE = Message;
    Db.ERRORLOG.Add(iLog);
    Db.SaveChanges(); //Get 23502 error
}

这是插入脚本,好像没有插入id,这是为什么呢?

INSERT INTO "pterrorlog"("message") VALUES (@p_0) RETURNING "id"

编辑:

在模型上添加此脚本后,它现在可以正常工作了。

public partial class ERRORLOG
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.None)]
  public long ID { get; set; } = DateTimeOffset.Now.ToUnixTimeMilliseconds();
  public string MESSAGE { get; set; }
}

标签: postgresqlentity-framework

解决方案


看起来实体框架会自动向列插入一个值。添加脚本以防止此问题后,它现在可以正常工作。

[DatabaseGenerated(DatabaseGeneratedOption.None)]

模型想要:

public partial class ERRORLOG
{
  [Key]
  [DatabaseGenerated(DatabaseGeneratedOption.None)]
  public long ID { get; set; } = DateTimeOffset.Now.ToUnixTimeMilliseconds();
  public string MESSAGE { get; set; }
}

推荐阅读