2

session_expires_at我的person数据库表中有一个列。此列是类型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)));

因为我知道这个值可能是空的,所以我之前正在运行检查以避免异常。如果该数据为 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如果数据库值为空,我无法采用默认值。必须可以分配一个空值。

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

4

1 回答 1

2

正如其他人已经在评论中提到的那样,由于andMapFrom()之间的类型不匹配,您的逻辑不起作用,因为不能。只有 nullable可以,所以不要使用你应该使用or 。nullDateTimeDateTimenullDateTimenull(DateTime)nulldefault(DateTime?)

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

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

CreateMap<DbDataReader, User>()
    .ForMember(
        user => user.SessionExpiresAt,
        options =>
        {
            options.PreCondition(dbDataReader => !dbDataReader.IsDBNull(1));
            options.MapFrom(dbDataReader => dbDataReader.GetDateTime(1));
        });
于 2020-07-25T14:25:46.520 回答