复杂对象的自动映射器映射
问题描述:
我正在使用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)
代码,它运行良好。我还验证了主键在数据库中存在相应的部门。任何人都可以指出我做错了什么?
答
与此代码
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);
}
}
感觉就像你在你的映射器做得太多。它应该在对象之间进行映射,而不是执行数据库调用。您是否尝试将数据加载到对象中,然后将该对象映射到dto.department?基本上你会调用两次地图,一次是父母,一次是孩子对象。 – JCherryhomes 2014-10-07 11:40:39