2017-03-26 15 views
1

せずに、ネストされたプロパティの設定参照:AutoMapper:私はAutoMapperでOrderクラスをマッピングするマッピング

class Order 
{ 
    public int Id { get; set; } 
    public int Quantity { get; set; } 
    public Product Product { get; set; } 
} 

Productクラス:私は注文および製品クラスの両方のためにAutoMapperマップを作成している

class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
} 

。 Productクラスでは、Id値をスキップします。

問題は、Order.Productを参照としてマップしたいという問題です。私はこの方法でそれを達成することができます:

var order = new Order { Id = 1, Quantity = 5, Product = new Product { Id = 1, Name = "CPU", Price = 500 } }; 
var newOrder = Mapper.Map<Order, Order>(order); 
newOrder.Product = order.Product; // I want to newOrder.Product reference point to the same object as order.Product 

このアプローチは、私が.Productてmanualyの参照を設定しなければならないので、私はこれがAutoMapperで行うことにしたい、私にとってはOKではありません。ネストされたProductプロパティを "古典的な方法"でマッピングすることは望ましくありません。新しいオブジェクトではまったく同じ参照が必要です。

ResolveUsingメソッドとIMemberValueResolverを使用してこの問題を解決しようとしましたが、成功しなかったAutoMapperは、他のOrderオブジェクトと同じ参照を設定するのではなく、ネストされたProductプロパティをマッピングしていました。最初の場所で

+0

? –

+0

最新版:v6.0.2 –

答えて

3

あなたはAfterMap方法に、newOrderProductプロパティを設定しますこれは、マッピング設定を経由して、最初のマッピングからProductプロパティを無視して、関数を渡す必要があります。

CreateMap<Order, Order>() 
    .ForMember(dest => dest.Product, opt => opt.Ignore()) 
    .AfterMap((src, dest) => 
    { 
     dest.Product = src.Product; 
    }); 

マッピング:あなたが使用している `AutoMapper`バージョン

var order = new Order { Id = 1, Quantity = 5, Product = new Product { Id = 1, Name = "CPU", Price = 500 } }; 
var newOrder = Mapper.Map<Order, Order>(order); 

//Ouputs: true 
Console.WriteLine(Object.ReferenceEquals(newOrder.Product, order.Product)); 
+0

優秀!それは動作します:)ありがとう!私はあなたにupvoteを与えるだろうが、私はできないので、私は15未満です。 –

+0

@JanJanuszあなたは答えを受け入れることができます:) –

+0

@JanJanuszありがとう:) –

関連する問題