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的内部对象的嵌套映射吗?
问题是源对象有可为null的字段,而目标对象没有。如果一个属性不可为null,并且您尝试将其设置为null,则会得到一个异常。要修复它,您有两个选项。要么使目标中的字段为空
public class OuterDest
{
public Guid? Id { get; set; }
public DateTime Date { get; set; }
}
或者在映射中创建一个自定义处理程序来处理null,并为有问题的字段设置默认值。
您的映射配置是什么?您需要分别映射outer=>outerdest和innersource=>innerdest,以便理解映射。