4

假设我有这个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; }
}

我想映射到下表:

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")
)

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

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

4

4 回答 4

4

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

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

于 2014-02-03T08:32:28.807 回答
3

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

于 2017-11-25T07:37:51.097 回答
2

可能您可以使用新SqlMapper.SetTypeMap方法来实现这一点。有关更多信息,请参阅https://stackoverflow.com/a/12615036/331281

于 2014-12-09T12:50:02.037 回答
1

据我所知,Dapper 目前不支持此类转换。您可以在 Dapper 中使用存储的 proc,并让 proc 为您进行转换。您还可以确保在将对象传递给 Dapper 之前完成数据/转换。

我强烈质疑您为什么选择int日期而不是DateTime数据源中的日期...似乎没有必要且过于复杂。

“总是写你的代码,好像下一个维护它的人是一个知道你家庭地址的挥舞着斧头的精神病患者。”

于 2014-01-14T18:01:42.820 回答