我正在使用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对象可以为空。
如果Inner对象有值,则投影工作正常,但如果Inner对象为null,则EF将抛出异常,就好像它不理解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用于可嵌套内部对象的嵌套映射?
答案 0 :(得分:0)
问题是你的源对象有可空字段而你的目标对象没有。如果属性不可为空并且您尝试将其设置为null,则会出现异常。要解决它,你有2个选择。使目标中的字段可以为空
public class OuterDest
{
public Guid? Id { get; set; }
public DateTime Date { get; set; }
}
或者在映射中创建自定义处理程序以处理空值并为相关字段设置默认值。
答案 1 :(得分:0)
你的映射配置是什么?您需要单独映射outsource =&gt; outerdest和innersource =&gt;最内层的,以便了解映射。