我有一个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);
}
答案 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; }
只需从Customer
到CustomerDetailsViewModel
的一个映射即可。对于与该约定不匹配的成员,您可以使用ForMember
。
您也可以始终对每个地址属性使用ForMember
:
Mapper.CreateMap<DataModels.Customer, CustomerDetailsViewModel>()
.ForMember(dest => dest.Street, opt => opt.MapFrom(src => src.Address.Street));
/* etc, for other address properties */
就个人而言,我不会太担心两次致电.Map
。至少在这种情况下,很明显正在映射Address
和Customer
属性。