Dapper:是否可以自定义特定类型的特定字段的类型映射?

Ami*_*iri 6 c# sql dapper micro-orm

假设我有这User门课:

public class User
{
    public int      ID          { get; set; }
    public string   FirstName   { get; set; }
    public string   LastName    { get; set; }
    public string   Email       { get; set; }
    public DateTime DateCreated { get; set; }
    public DateTime LastLogin   { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想将其映射到下表:

CREATE TABLE "user" (
  "ID"          int(11) NOT NULL AUTO_INCREMENT,
  "FirstName"   varchar(45) DEFAULT NULL,
  "LastName"    varchar(45) DEFAULT NULL,
  "Email"       varchar(255) NOT NULL,
  "DateCreated" int(11) NOT NULL,
  "LastLogin"   int(11) NOT NULL,
  PRIMARY KEY ("ID")
)
Run Code Online (Sandbox Code Playgroud)

或者用更简单的话来说:我想将 DateTime 属性存储为数据库中的 int 字段。然而,这个类/表就是这种情况。其他类/表可能会以不同的方式映射。我正在考虑将自定义转换函数与类型或成员映射结合起来的一些事情。

是否可以使用 Dapper 来实现这一目标?如果可以,如何实现?

Ami*_*iri 6

最重要的是,Dapper 在设计上并不支持这一点。其核心设计原则之一是表和对象之间的 1:1 映射,但列名到属性名的映射除外。

我最终采用的解决方案是将 Dapper 与 AutoMapper 结合起来,无论如何我们已经大量使用了 AutoMapper。在我们的 Dapper DAO 中,在复杂的情况下,我们使用与域对象分离的实体对象并在它们之间进行映射。因此,域和表之间的重要映射本质上变成了对象到对象映射的简单问题。


sig*_*urd 6

现在这应该可以通过 custom 实现SqlMapper.TypeHandler。请参阅单元测试中的此示例。缺点是它将自定义类型处理应用于同一类型的所有字段。在您的情况下,所有 DateTime 属性都将通过类型处理程序进行评估。