AutoMapper项目嵌套对象,其中内部对象可为null失败

本文关键字:内部对象 null 失败 项目 嵌套 对象 AutoMapper | 更新日期: 2023-09-27 18:28:58

我正在使用AutoMapper来投影以下结构

public class OuterSource
{
    ....
    public Guid? InnerId { get; set }
    public InnerSource Inner { get; set; }
}
public class InnerSource
{
    public Guid Id { get; set; }
    public DateTime Date { get; set; }
}
public class OuterDest
{
    ....
    public InnerDest Inner { get; set; }
}
public class InnerDest
{
     public Guid Id { get; set; }
     public DateTime Date { get; set; }
}

var result = AutoMapper.Project<OuterSource, OuterDest>(query);

正如您所看到的,Inner对象是可以为null的。

如果Inner对象有一个值,则投影工作正常,但如果Inner object为null,则EF将抛出一个Exception,就好像它不知道InnerDest实际上应该为null一样。

"The cast to value type 'Guid' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type."

使用

var result = AutoMapper.Map<IEnumerable<OuterSource>, IEnumerable<OuterDest>>(query);

确实解决了我的问题,但很明显我更喜欢使用这个项目。

有什么好的方法可以解决这个问题吗?或者我可以简单地不使用.Project来处理具有可为null的内部对象的嵌套映射吗?

AutoMapper项目嵌套对象,其中内部对象可为null失败

问题是源对象有可为null的字段,而目标对象没有。如果一个属性不可为null,并且您尝试将其设置为null,则会得到一个异常。要修复它,您有两个选项。要么使目标中的字段为空

public class OuterDest
{
     public Guid? Id { get; set; }
     public DateTime Date { get; set; }
}

或者在映射中创建一个自定义处理程序来处理null,并为有问题的字段设置默认值。

您的映射配置是什么?您需要分别映射outer=>outerdest和innersource=>innerdest,以便理解映射。