2012-02-17 14 views
4

私は、Addressテーブルへの参照を含むCustomers EF POCOクラスを持っています。オートマトンを使用してネストされたオブジェクトをマップする

次のコードはうまくいくようですが、これを行うには最もクリーンな方法ではないかと思います。 1つのMapコールだけを使用してこれをマップする方が良いでしょうか?

[HttpGet] 
    public ActionResult Details(string ID) 
    { 
     BusinessLogic.Customers blCustomers = new BusinessLogic.Customers("CSU"); 
     DataModels.Customer customer = blCustomers.GetCustomer(ID); 

     CustomerDetailsViewModel model = new CustomerDetailsViewModel(); 

     Mapper.CreateMap<DataModels.Customer, CustomerDetailsViewModel>(); 
     Mapper.CreateMap<DataModels.Address, CustomerDetailsViewModel>(); 
     Mapper.Map(customer, model); 
     Mapper.Map(customer.Address, model); 

     return View(model); 
    } 

答えて

14

あなたのCustomerDetailsViewModelがどのように見えるかによって異なります。

public class Address 
{ 
    public string Street { get; set; } 
    public string City { get; set; } 
} 

CustomerDetailsViewModelは、この規則次のプロパティが含まれています:たとえば、場合、あなたのAddressクラスは、次のようになります

あなたはAutoMapperで元/宛先タイプのペア、 コンフィギュレータの試みにを設定する場合ソースのプロパティとメソッドを一致させて宛先タイプのプロパティに を入力します。 宛先タイプのいずれかのプロパティのプロパティ、メソッド、または接頭辞が "Get"の がソースタイプに存在しない場合、AutoMapperは宛先名を個別の単語に分割します(PascalCase規則)。

(出典:Flattening

その後、CustomerDetailsViewModelは性質を持っている場合:CustomerからCustomerDetailsViewModel

public string AddressStreet { get; set; } 
public string AddressCity { get; set; } 

ただ1つのマッピングは動作します。その規約に合致しないメンバーの場合は、ForMemberを使用できます。

あなたはいつものようにも一つ一つのアドレスプロパティにForMemberを使用することができます。

Mapper.CreateMap<DataModels.Customer, CustomerDetailsViewModel>() 
    .ForMember(dest => dest.Street, opt => opt.MapFrom(src => src.Address.Street)); 
    /* etc, for other address properties */ 

個人的に、私は二回.Mapを呼び出すことについてあまり心配ではないでしょう。少なくともそのように、AddressCustomerの両方のプロパティがマップされていることは明らかです。