automapper mapfrom不能接受空值

d4so4syb  于 2021-07-29  发布在  Java
关注(0)|答案(1)|浏览(431)

这个问题在这里已经有答案了

自动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过程,这样它就不会赋值了?

lztngnrs

lztngnrs1#

正如其他人在评论中已经提到的,你的 MapFrom() 逻辑不起作用,因为它们之间的类型不匹配 null 以及 DateTime ,作为 DateTime 不能是 null . 只能为空 DateTime 可以,所以不用 null 你应该使用 (DateTime)null 或者 default(DateTime?) .

CreateMap<DbDataReader, User>()
    .ForMember(
        user => user.SessionExpiresAt,
        options => options.MapFrom(dbDataReader => dbDataReader.IsDBNull(1) ? default(DateTime?) : dbDataReader.GetDateTime(1)));

另一种可能更具可读性的方法是使用 PreCondition() ,您可以在实际Map之前检查reader中的特定值是否为null。如果是,Map SessionExpiresAt 不会发生的。

CreateMap<DbDataReader, User>()
    .ForMember(
        user => user.SessionExpiresAt,
        options =>
        {
            options.PreCondition(dbDataReader => !dbDataReader.IsDBNull(1));
            options.MapFrom(dbDataReader => dbDataReader.GetDateTime(1));
        });

相关问题