复杂对象的自动映射器映射

复杂对象的自动映射器映射

问题描述:

我正在使用Automapper将我的模型对象映射到DTO。在DTO中,主键应该替换为相应的对象。为了这个目的,我用下面的代码:复杂对象的自动映射器映射

// Model class 
public class SubDepartment 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
    public long? DepartmentId { get; set; } 
    public DateTime LastUpdated { get; set; } 
} 

// DTO class 
public class SubDepartmentDTO 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
    public Department Department { get; set; } 
    public long EventCount { get; set; } 
} 

// Mapping code 

Mapper.CreateMap<Models.Event.SubDepartment, DTO.SubDepartment>().ForMember(dto => dto.Department, 
       map => map.MapFrom(sd => Mapper.Map<Department, DTO.Department>(_departmentRepository.GetById(sd.DepartmentId.Value)))); 

但是,当我在我的控制器从SUBDEPARTMENT映射到SubDepartmentDTO的“部门”对象始终是零。我尝试用硬编码的Department对象替换_departmentRepository.GetById(sd.DepartmentId.Value)代码,它运行良好。我还验证了主键在数据库中存在相应的部门。任何人都可以指出我做错了什么?

+4

感觉就像你在你的映射器做得太多。它应该在对象之间进行映射,而不是执行数据库调用。您是否尝试将数据加载到对象中,然后将该对象映射到dto.department?基本上你会调用两次地图,一次是父母,一次是孩子对象。 – JCherryhomes 2014-10-07 11:40:39

与此代码

Mapper.CreateMap<Models.Event.SubDepartment, DTO.SubDepartment>().ForMember(dto => dto.Department,map => map.MapFrom(sd => _departmentRepository.GetById(sd.DepartmentId.Value))); 

尝试它,如果它不工作,你可以尝试自定义值解析器

Models.Event.SubDepartment, DTO.SubDepartment>().ForMember(dto => dto.Department, map => map.ResolveUsing<DepartmentResolver>()); 

public class DepartmentResolver: ValueResolver<Models.Event.SubDepartment,DTO.SubDepartment> 
{ 
    Reporsitory _departmentRepository; 
    protected override DTO.SubDepartment ResolveCore(Models.Event.SubDepartment source) 
    { 
     return _departmentRepository.GetById(source.DepartmentId.Value); 
    } 
}