2016-08-02 4 views
0

Automapperを使用してViewModelをDomainクラスにマップしようとしています。プロパティがソースに存在しない場合のオートマッパーマッピング

ただし、ViewModelにはDomainクラスに存在しないプロパティが含まれています。

代わりに、Domainクラスの別のプロパティProductを使用してViewModel Priceプロパティにマップしていますが、これは動作していないようです。

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

しかし、価格のプロパティが(nullではない)のように空である:

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>())); 
     } 
    } 

はその後、私のコントローラで私が持っている:私のマッピングプロファイルで次に
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; } 

} 

は、私は次のセットアップを持っていますそのプロパティはインスタンス化されています。ちょうどレコードがありません。

私は間違っていますか?

+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()を追加する必要があります。 opts => opts.MapFrom(src => src.Product.Select(p => new Price {Charge = p.Amount 、CourierCharge = p.DeliveryCharge、UniqueProductCode = p.Code})。ToArray()) – TwistedStem

+0

凡例。あなたの最初の答えは治療になりました。ありがとうございました。 – jgill09

関連する問題