使用 Dapper 插入具有默认值的表

Posted

技术标签:

【中文标题】使用 Dapper 插入具有默认值的表【英文标题】:Using Dapper to Insert into a Table with Default Values 【发布时间】:2017-02-03 16:39:44 【问题描述】:

我有一个表,它的字段不为空,并且定义了默认值

[CreatedOn] not null default(getdate())

我在模型中为 dapper 使用的属性是可以为空的 DateTime

public DateTime? CreatedOn  get; set; 

如果我尝试插入,则会因尝试在非空字段中插入空值而引发异常。

cm.Insert<MyObject>(obj); //Throws because CreatedOn == null

我正在寻找的是由数据库设置的默认值,并且在我读取对象时仍然能够看到该值。因为 Dapper 将值作为 null 传递,所以数据库会抛出错误。如果我忽略该属性,那么我将失去阅读它的能力。我希望有一个单向的忽略,或者一个让 dapper 知道会有默认值的标志。如何做到这一点?

【问题讨论】:

【参考方案1】:

对于上面的问题,我通过在构造函数中添加它们来非常简单地处理 dapper 默认值。你的情况是这样的:

  [Table("my_objects")]
  public class MyObject
  
    public DateTime? CreatedOn  get; set; 

    public MyObject()
    
      CreatedOn = DateTime.UtcNow;
    
  

但是,如果您尝试通过 dapper 而不是在数据库中处理 created_at 和 updated_at,我建议您遵循我在此处概述的路线 - Dapper control dates

最后,如果你想让数据库处理这个字段,你可以使用下面的例子:

  [Table("my_objects")]
  public class MyObject
  
    [Dapper.IgnoreUpdate, Dapper.IgnoreInsert]
    public DateTime? CreatedOn  get; set; 
  

【讨论】:

我正在寻找的是由数据库设置的默认值,并且在我读取对象时仍然能够看到该值。因为 Dapper 将值作为 null 传递,所以数据库会抛出错误。如果我忽略该属性,那么我将失去阅读它的能力。我希望有一个单向的忽略,或者一个让 dapper 知道会有默认值的标志。 啊,您可以在 CreatedOn 上使用以下属性 - [Dapper.IgnoreUpdate, Dapper.IgnoreInsert]。我编辑了上面的例子来展示这个属性是如何适应的。这将阻止 DapperSimpleCrud 在插入或更新时使用它们。 这些属性在什么命名空间中? Dapper.Contrib 有一个名为 Write 的属性,它接受 true 或 false,但不会阻止写入。 这些存在于 DapperSimpleCrud - github.com/ericdc1/Dapper.SimpleCRUD 我试图确认这一点,但我认为在整个解决方案中多次引用基本 dapper 扩展阻止了这一点。我将使用 dapper.simplecrud 创建一个参考项目,然后重试。

以上是关于使用 Dapper 插入具有默认值的表的主要内容,如果未能解决你的问题,请参考以下文章

实体框架不包括插入查询中具有默认值的列

将 NULL 插入具有默认值的 NOT NULL 列

PostgreSQL:条件插入默认值

为啥我从 Dapper 返回的对象具有 null 和默认属性值?

如何在表中添加具有默认值的列

Laravel 迁移:添加具有现有列默认值的列