2016-02-12 88 views
0

我一直在浏览AutoMapper文档和相关问题,试图找到一个建议的解决方案,但一直没有找到它。Automapper多源到一个目的地

比方说,我有一个像源如下:

public class Person{ 
    public string PersonId{get;set;} 
    public string FirstName {get;set;} 
    public string LastName{get;set;} 
    public List<Company> Companies {get;set;} 
} 

public class Company{ 
    public string CompanyName {get;set;} 
    public string CompanyAddress {get;set;} 
    public List<UserRoles> UserRoles 
} 

public class UserRoles{ 
    public string PersonId{get;set;} 
    public List<Roles> Roles {get;set;} 
} 

public class Roles{ 
    public string RoleId{get;set;} 
    public string RoleDescription {get;set;} 
} 

我想上面的源对象到目标对象映射如下:

public class Person{ 
    public string PersonId{get;set;} 
    public string FirstName {get;set;} 
    public string LastName{get;set;} 
    public List<CompanyViewModel> CompanyViewModel {get;set;} 
} 

public class CompanyViewModel{ 
    public string CompanyName {get;set;} 
    public string CompanyAddress {get;set;} 
    public List<RolesViewModel> RolesViewModel {get;set;} 
} 

public class RolesViewModel{ 
    public string RoleId{get;set;} 
    public string RoleDescription {get;set;} 
} 

我曾尝试下面的代码映射一起:

CreateMap<Person, PersonViewModel>(); 

CreateMap<Company, CompanyViewModel>(); 

CreateMap<UserRoles, IEnumerable<CompanyViewModel>>() 
        .ConvertUsing<CompanyRolesMapping>(); // Not sure 

CreateMap<Roles, RolesViewModel>(); 

父级人员数据能够正确映射,但chil d级公司和角色级别的数据不是。

我不知道如何去关于第三部分(将该项目映射到集合中的项目)。

这样做最干净的方法是什么?

+0

如果您希望它自动映射,则源和目标上的属性名称必须相同。否则,你将不得不使用'ForMember'扩展来映射子实体和实体集合。 – Sam

+0

好的@Sam,谢谢。 –

回答

1

我使用了以下技术,效果很好。

public void IntializeUserCompanyRolesMapping() 
{ 
      CreateMap<Roles, RolesViewModel>(); 

      CreateMap<ICollection<Roles >, CompanyViewModel>() 
       .ForMember(d => d.CompanyName , opt => opt.Ignore()) 
       .ForMember(d => d.CompanyAddress , opt => opt.Ignore()) 
       .ForMember(d => d.RolesViewModel, opt => opt.MapFrom(s => s)); 

      CreateMap<UserRoles, CompanyViewModel>() 
       .ForMember(d => d.RolesViewModel , opt => opt.MapFrom(s => s.Roles)); 

      CreateMap<Person, Person>() 
       .ForMember(d => d.CompanyViewModel , opt => opt.MapFrom(s => MapCompanyToCompanyViewModel(s.Companies))); 

}    

我已经使用自定义方法来遍历公司列表并添加到公司视图模型列表中。

private Collection<CompanyViewModel> MapCompanyToCompanyViewModel(ICollection<Company> Companies) 
    { 
     var companyViewModels = new Collection<CompanyViewModel>(); 
       foreach (var company in Companies) 
     { 
      foreach (var companyViewModel in company.UserRoles.Select(Mapper.Map<CompanyViewModel>)) 
      { 
       companyViewModels.Add(companyViewModel); 
      } 
     } 
     return companyViewModels; 

    }