使用 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 插入具有默认值的表的主要内容,如果未能解决你的问题,请参考以下文章