假设我有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实现这一目标,如果是这样的话?
答案 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属性。