【问题标题】:Using Dapper to Insert into a Table with Default Values使用 Dapper 插入具有默认值的表
【发布时间】: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 知道会有默认值的标志。如何做到这一点?

【问题讨论】:

    标签: dapper-extensions


    【解决方案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 创建一个参考项目,然后重试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多