2014-11-04 57 views
5

我使用AutoMapper项目如下结构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对象为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嵌套映射与可为空的内部对象?

回答

0

问题是您的源对象具有可为空的字段,而您的目标对象没有。如果某个属性不可为空,并且您尝试将其设置为空,则会发生异常。要解决它,你有2个选项。要么使字段中的目的地为空的

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

或者在您映射到处理空值和设定的默认值有问题的领域创建一个自定义处理程序。

0

什么是您的映射配置?您需要单独映射outsource => outerdest和innersource => innerdest,以便映射被理解。