【问题标题】:Mapping null values result in default types values(Automapper ADO.NET)映射空值导致默认类型值(Automapper ADO.NET)
【发布时间】:2018-10-10 05:40:01
【问题描述】:

最近我在后端添加了 AutoMapper(7.0.1),顺便说一下,它不使用任何 ORM,只是简单的 ADO.NET。

所以我为我们的模型创建了如下映射配置文件:

public class UserMapping:Profile
{
    public UserMapping()
    {
        var mappingExpression = CreateMap<DataRow, User>();
        mappingExpression.ForMember(d => d.Id, o => o.MapFrom(s => s["Id"]));
        mappingExpression.ForMember(d => d.Location, o => o.MapFrom(s => s["Location"]));
        mappingExpression.ForMember(d => d.Team, o => o.MapFrom(s => s["Team"]));
        mappingExpression.ForMember(d => d.LoginId, o => o.MapFrom(s => s["LoginID"]));
        mappingExpression.ForMember(d => d.FirstName, o => o.MapFrom(s => s["FirstName"]));
        mappingExpression.ForMember(d => d.LastName, o => o.MapFrom(s => s["LastName"]));
        mappingExpression.ForMember(d => d.Email, o => o.MapFrom(s => s["Email"]));
        mappingExpression.ForMember(d => d.Active, o => o.MapFrom(s => s["Active"]));
        mappingExpression.ForMember(d => d.Date, o => o.MapFrom(s => s["Date"]));
        mappingExpression.ForMember(d => d.Entity, o => o.MapFrom(s => s["Entity"]));
    }
}

还有一个用于初始化映射器的实用程序类。

 public static class Mapping
{
    public static void Configure()
    {

        Mapper.Initialize(cfg =>
        {
              cfg.AddProfile<UserMapping>();
                 //other profiles

            cfg.AllowNullCollections = true;
            cfg.AllowNullDestinationValues = true;
        });
    }


}

我的问题是

  • 每个字符串属性,即使它在数据库中为空,在映射后也会作为空字符串返回

  • 时间跨度?如果在数据库中为空,则返回 00:00:00

  • 布尔?被返回为假

由于前端的开发方式需要空值,我不需要忽略空值。

我发现我可以使用

 cfg.AllowNullCollections = true;
 cfg.AllowNullDestinationValues = true;

但不幸的是,映射过程仍然没有返回空值。 这是为什么呢?

谢谢

【问题讨论】:

  • 尝试使用 ResolveUsing。
  • 卢锡安您好,感谢您的评论。我做到了,但这并没有解决任何问题。
  • 我以为它会抛出。检查the execution plan

标签: c# automapper


【解决方案1】:

经过数小时的搜索,我找到了解决方法。

例如对于我关心的属性 我将映射表达式从

mappingExpression.ForMember(m => m.CutOffTime, s => s.MapFrom(o => o["CutOffTime"]));

 mappingExpression.ForMember(m => m.CutOffTime, s => s.MapFrom(o => o["CutOffTime"] ==  DBNull.Value ? null : o["CutOffTime"] ));

现在 api 应该返回 null 值。

【讨论】:

  • 是的,但肯定有例外,因为AM不关心DBNull。
  • Lucian 我希望我看到了一个例外,我至少会有一个解决问题的方向,而不是试图找到解决方法。
  • 调试器中总是有第一次机会异常,但 MapFrom 会捕获该异常。 ResolveUsing 没有。
猜你喜欢
  • 1970-01-01
  • 2019-08-17
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多