【问题标题】:Using automapper to map nested objects使用 automapper 映射嵌套对象
【发布时间】:2012-02-17 23:56:27
【问题描述】:

我有一个客户 EF POCO 类,其中包含对地址表的引用。

以下代码似乎可以工作,但我不确定它是否是最干净的方法。有没有更好的方法来映射这个只使用一个 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);
    }

【问题讨论】:

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


    【解决方案1】:

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

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

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

    在 AutoMapper 中配置源/目标类型对时, 配置器尝试匹配源上的属性和方法 类型到目标类型的属性。如果对于任何财产 目标类型 属性、方法或以“Get”为前缀的方法 源类型上不存在,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 属性都被映射了。

    【讨论】:

      猜你喜欢
      • 2017-07-20
      • 2022-01-06
      • 2020-04-03
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多