这个问题在这里已经有答案了:
自动Map到可为空的datetime属性(2个答案)
9个月前关门了。
我有一个专栏 session_expires_at
在我的 person
数据库表。此列的类型为 DATETIME
可为空。在我的代码中 User
对象用
public DateTime? SessionExpiresAt { get; set; }
当使用mysql.data包从数据库读取用户时,我想使用automapper将数据库结果Map到 User
对象。
CreateMap<DbDataReader, User>()
.ForMember(user => user.SessionExpiresAt,
memberOptions => memberOptions.MapFrom(dbDataReader => dbDataReader.IsDBNull(1) ? null : dbDataReader.GetDateTime(1)));
因为我知道这个值可能是空的,所以我在前面运行了一个检查来避免异常。如果该数据为null,我想为属性赋值null,否则为datetime值。不幸的是,这个错误出现了
“null”和“system.datetime”之间没有隐式转换
我玩了一会儿 MapFrom
方法不能接受空值。所以如果我这么做
CreateMap<DbDataReader, User>()
.ForMember(user => user.SessionExpiresAt, memberOptions => memberOptions.MapFrom(dbDataReader => null));
我得到这个错误
无法从用法推断类型参数。请尝试显式指定类型参数
我也试过,但没用
CreateMap<DbDataReader, User>()
.ForMember(user => user.SessionExpiresAt,
memberOptions =>
{
memberOptions.AllowNull();
memberOptions.MapFrom(dbDataReader => dbDataReader.GetDateTime(1));
});
我不可能接受像这样的默认值 DateTime.Now
如果数据库值为空。必须能够分配空值。
如何修复它,以便为Map规则中的属性分配空值?如果值为null,那么我可以禁用Map过程,这样它就不会赋值了?
1条答案
按热度按时间lztngnrs1#
正如其他人在评论中已经提到的,你的
MapFrom()
逻辑不起作用,因为它们之间的类型不匹配null
以及DateTime
,作为DateTime
不能是null
. 只能为空DateTime
可以,所以不用null
你应该使用(DateTime)null
或者default(DateTime?)
.另一种可能更具可读性的方法是使用
PreCondition()
,您可以在实际Map之前检查reader中的特定值是否为null。如果是,MapSessionExpiresAt
不会发生的。