AutoMapper MapFrom 不能取空值

AutoMapper MapFrom can't take null values

我的 person 数据库 table 中有一列 session_expires_at。此列的类型为 DATETIME 并且可以为空。在我的代码中,我的 User 对象用

表示此列
public DateTime? SessionExpiresAt { get; set; }

当使用 MySQL.Data 包从数据库中读取用户时,我想使用 AutoMapper 将数据库结果映射到 User 对象。

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

因为我知道这个值可能为空,所以我在 运行 之前进行了检查以避免异常。如果该数据为空,我想将空分配给 属性,否则为日期时间值。不幸的是,这个错误出现了

There is no implicit conversion between 'null' and 'System.DateTime'

我试了一下,MapFrom 方法无法获取空值。所以如果我这样做

CreateMap<DbDataReader, User>()
    .ForMember(user => user.SessionExpiresAt, memberOptions => memberOptions.MapFrom(dbDataReader => null));

我收到这个错误

The type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly

我也试过了,但没用

CreateMap<DbDataReader, User>()
    .ForMember(user => user.SessionExpiresAt,
        memberOptions =>
        {
            memberOptions.AllowNull();
            memberOptions.MapFrom(dbDataReader => dbDataReader.GetDateTime(1));
        });

如果数据库值为空,我不可能采用 DateTime.Now 这样的默认值。必须可以分配空值。

如何修复它以便我可以将空值分配给映射规则中的 属性?如果值为空,也许我可以禁用映射过程,这样它就不会分配任何东西?

正如评论中已经提到的其他人一样,由于 nullDateTime 之间的类型不匹配,您的 MapFrom() 逻辑不起作用,因为 DateTime 不能 null。只有可为空的 DateTime 可以,因此您应该使用 (DateTime)nulldefault(DateTime?).

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

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

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