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
这样的默认值。必须可以分配空值。
如何修复它以便我可以将空值分配给映射规则中的 属性?如果值为空,也许我可以禁用映射过程,这样它就不会分配任何东西?
正如评论中已经提到的其他人一样,由于 null
和 DateTime
之间的类型不匹配,您的 MapFrom()
逻辑不起作用,因为 DateTime
不能 null
。只有可为空的 DateTime
可以,因此您应该使用 (DateTime)null
或 default(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));
});
我的 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
这样的默认值。必须可以分配空值。
如何修复它以便我可以将空值分配给映射规则中的 属性?如果值为空,也许我可以禁用映射过程,这样它就不会分配任何东西?
正如评论中已经提到的其他人一样,由于 null
和 DateTime
之间的类型不匹配,您的 MapFrom()
逻辑不起作用,因为 DateTime
不能 null
。只有可为空的 DateTime
可以,因此您应该使用 (DateTime)null
或 default(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));
});