2010-06-21 104 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