2010-06-21 74 views
8

我用Automapper将我的对象映射到dtos。Automapper null属性

public class OrderItem : BaseDomain 
{ 
    public virtual Version Version { get; set; } 
    public virtual int Quantity { get; set; } 
} 




[DataContract] 
[Serializable] 
public class OrderItemDTO 
{ 
    [DataMember] 
    public int Id { get; set; } 
    [DataMember] 
    public string Guid { get; set; } 
    [DataMember] 
    public virtual int? VersionId { get; set; } 
    [DataMember] 
    public virtual string VersionName { get; set; } 
    [DataMember] 
    public virtual int Quantity { get; set; } 

} 

所以当我有OrderItem的与空的版本,我终于找到一个例外:

Mapper.Map<OrderItem, OrderItemDTO>(item) 

Missing type map configuration or unsupported mapping. 
+0

您可以将代码发布到您创建映射的位置吗? – 2010-06-21 12:31:50

回答

21

没有见过你的映射代码很难说究竟是怎么回事错误的,但我的猜测是,您正在使用类似下面的代码映射你的类型:

Mapper.CreateMap<OrderItem, OrderItemDTO>() 
     .ForMember(dest => dest.VersionId, options => options.MapFrom(orderitem => orderitem.Version.VersionId)) 
     .ForMember(dest => dest.VersionName, options => options.MapFrom(orderitem => orderitem.Version.VersionName)) 
     ; 

OrderItem.Version为null上面的代码将失败。为防止出现这种情况,您可以在代理中检查是否为空:ForMember

Mapper.CreateMap<OrderItem, OrderItemDTO>() 
     .ForMember(dest => dest.VersionId, options => options.MapFrom(orderitem => orderitem.Version == null ? (int?) null : orderitem.Version.VersionId)) 
     .ForMember(dest => dest.VersionName, options => options.MapFrom(orderitem => orderitem.Version == null ? null : orderitem.Version.VersionName)) 
     ; 
+2

我认为automapper会足够聪明来处理空属性 – Jordan 2011-07-20 16:21:03

+5

@Jordan:当您创建自己的映射来扁平化结构时,就像上面使用lambda“orderitem => orderitem.Version.VersionId”和orderitem.Version为空,AutoMapper无法检测到lambda中存在问题。 – 2011-07-20 16:24:50

+0

你在这里使用什么版本? – 2012-09-30 22:13:19