使用PetaPoco(和Npgsql)

时间:2016-10-06 18:55:05

标签: database postgresql petapoco

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

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 值被赋予&#34; timestamp&#34;新记录。如何修复此问题,以便使用 PostgreSQL DEFAULT值?

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

非常感谢任何帮助。

编辑:ica9类由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; }
    }

1 个答案:

答案 0 :(得分:1)

当您在表中执行SQL INSERT时,如果为列提供值,则即使该列存在默认值,也会存储该值。

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

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

  • 标记为&#39;结果列&#39;
  • 的列
  • 主键列

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

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