使用 PetaPoco(和 Npgsql)的默认值向 PostgreSQL 插入一条新记录

Inserting a new record to PostgreSQL with default values from PetaPoco (and Npgsql)

在 PostgreSQL (9.5) 中,我有以下 table 定义:

CREATE TABLE icd9
(
  recid serial NOT NULL,
  code text,
  cdesc text NOT NULL,
  "timestamp" timestamp without time zone DEFAULT now(),
  CONSTRAINT pk_icd9_recid PRIMARY KEY (recid)
)

使用PetaPoco,我有以下声明:

 icd9 newicd9 = db.SingleOrDefault<icd9>("select * from icd9 where lower(cdesc) = lower(@0)", newdx.cdesc);

 if (newicd9 == null)
 {       
       newicd9 = new icd9 { cdesc = newdx.cdesc.ToLower(), code = newdx.code};
       db.Insert(newicd9);
  }

使用 PetaPoco/Npgsql 执行 Insert(newicd9) 导致 no 值被赋予新记录的 "timestamp"。我该如何解决这个问题,以便使用 PostgreSQL DEFAULT 值?

(我可以在创建 newicd9 实例时为时间戳赋值,但我希望 PostgreSQL 使用 DEFAULT now() 方法为其赋值)。

非常感谢任何帮助。

编辑:icd9 class 由 PetaPoco T4 模板定义为:

    [TableName("nova.icd9")]
    [PrimaryKey("recid")]
    [ExplicitColumns]
    public partial class icd9 : chaosDB.Record<icd9>  
    {
        [Column] public int recid { get; set; }
        [Column] public string code { get; set; }
        [Column] public string cdesc { get; set; }
        [Column] public DateTime? timestamp { get; set; }
    }

当您将 SQL INSERT 执行到 table 时,如果您为列提供了一个值,那么即使有一个默认值,该值也会被存储专栏。

应用默认值的唯一方法是不将列包含在 SQL INSERT 语句中。

检查 PetaPoco 源代码,我可以看到它使用除以下所有列之外的所有列构造 INSERT 语句:

  • 列标记为 'result columns'
  • 主键列

您可以将此时间列标记为结果列(通过使用 [ResultColumn] 装饰),但根据我对代码的阅读,这也会将其从自动生成的 SELECT 子句中排除。

免责声明:虽然我对 postgresql 有所了解,但对 .NET 或 petapoco 却一无所知!