使用automapper映射嵌套对象

时间:2012-02-17 23:56:28

标签: asp.net-mvc entity-framework automapper

我有一个Customer EF POCO类,其中包含对Address表的引用。

以下代码似乎有效,但我不确定这是最干净的方法。有没有更好的方法只使用一次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);
    }

1 个答案:

答案 0 :(得分:14)

这取决于你CustomerDetailsViewModel的样子。例如,如果您的Address类看起来像这样:

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

CustomerDetailsViewModel包含遵循此约定的属性:

  

在AutoMapper中配置源/目标类型对时,   配置程序尝试匹配源上的属性和方法   键入目标类型的属性。如果对于任何财产   目标类型以“获取”为前缀的属性,方法或方法   在源类型上不存在,AutoMapper会分割目标   成员名称为单个单词(通过PascalCase约定)。

(来源:Flattening

然后,如果CustomerDetailsViewModel具有属性:

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

只需从CustomerCustomerDetailsViewModel的一个映射即可。对于与该约定不匹配的成员,您可以使用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属性。