2016-08-02 130 views
0

我試圖使用Automapper將ViewModel映射到Domain類。當源中不存在屬性時自動映射器映射

但是,ViewModel包含一個不存在於Domain類中的屬性。

相反,我使用Domain類中的一個不同的屬性Product來映射到ViewModel Price屬性,但這看起來沒有起作用。

public class OrderViewModel 
{ 
    public IEnumerable<Product> Product { get; set; } 

    public IEnumerable<Price> Price { get; set; } 

} 

public class Order 
{ 
    public IEnumerable<Product> Product { get; set; } 
} 

public class Product 
{ 
    public string Code { get; set; } 

    public string Name { get; set; } 

    public string Description { get; set; } 

    public decimal Amount { get; set; } 

    public decimal DeliveryCharge { get; set; } 

} 

public class Price 
{ 
    public string UniqueProductCode { get; set; } 

    public decimal Charge { get; set; } 

    public decimal CourierCharge { get; set; } 

} 
在我的映射分佈

然後,我必須設置如下:

public class DomainToViewModelMappingProfile : Profile 
    { 
     public override string ProfileName 
     { 
      get 
      { 
       return "DomainToViewModelMappings"; 
      } 
     } 

     public DomainToViewModelMappingProfile() 
     { 
      ConfigureMappings(); 
     } 


     /// <summary> 
     /// Creates a mapping between source (Domain) and destination (ViewModel) 
     /// </summary> 
     private void ConfigureMappings() 
     { 

      CreateMap<Core.Domain.Product, Web.Models.Price>() 
       .ForMember(dest => dest.UniqueProductCode, 
          opts => opts.MapFrom(src => src.Code)) 
       .ForMember(dest => dest.Charge, 
          opts => opts.MapFrom(src => src.Amount)) 
       .ForMember(dest => dest.CourierCharge, 
          opts => opts.MapFrom(src => src.DeliveryCharge)); 

    CreateMap<Core.Domain.Order, OrderViewModel>() 
        .ForMember(dest => dest.Product, 
           opts => opts.MapFrom(src => src.Product)) 
        .ForMember(dest => dest.Price, 
           opts => opts.MapFrom(src => new List<Price>())); 
     } 
    } 

然後在我的控制,我有:

var list = _productRepository.GetProducts(); 
Mapper.Map<Order, OrderViewModel>(list); 

但價格屬性爲空(NOT NULL)作爲該屬性已被實例化。只是沒有記錄。

我在做什麼錯?

+0

請問你能顯示你用來映射的代碼嗎? – sachin

+0

'.ForMember(dest => dest.Price,opts => opts.MapFrom(src => new List ()));'等同於'對於成員'Price',只需創建一個空列表。「 - 你在說什麼? – stuartd

+0

在映射配置文件代碼@sachin中添加。 – jgill09

回答

0
.ForMember(dest=>dest.Price, opts=>opts.MapFrom(src=>new List<Price>())); 

意思是你正在設置dest.Price = new List();試試這個:

.ForMember(dest=>dest.Price, opts=>opts.MapFrom(src=>src.Product.Select(p=>new Price {Charge = p.Amount,CourierCharge = p.DeliveryCharge,UniqueProductCode = p.Code}))); 
+0

如果存在運行時錯誤,您可能需要將.ToArray()添加到select中,如下所示: opts => opts.MapFrom(src => src.Product.Select(p => new Price {Charge = p.Amount ,CourierCharge = p.DeliveryCharge,UniqueProductCode = p.Code})。ToArray()) – TwistedStem

+0

圖例。你的第一個回答很有幫助。謝謝。 – jgill09