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

时间:2014-01-14 17:57:13

标签: 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; }
}

我要映射到下表:

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 个答案:

答案 0 :(得分:2)

底线是Dapper不支持这种设计。其核心设计原则之一是表和对象之间的1:1映射,但列名称与属性名称映射除外。

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

答案 1 :(得分:1)

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

我非常怀疑为什么你选择int日期与DateTime但是在您的数据源中......似乎没必要且过于复杂。

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

答案 2 :(得分:1)

可能您可以使用新的SqlMapper.SetTypeMap方法来实现此目的。有关详细信息,请参阅https://stackoverflow.com/a/12615036/331281

答案 3 :(得分:1)

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