Automapper - 使用IEnumerable <anothertype> </anothertype>映射对象

时间:2014-01-16 21:18:01

标签: c# automapper

已解决:我的属性定义不正确!

我收到此错误... 缺少类型映射配置或不支持的映射。 映射类型: HouseDomain - &gt; RoomDomain {namespace} .HouseDomain - &gt; {namespace} .RoomDomain

目的地路径: City.Houses.Houses.Houses0 [0]

例如,我有

public class CityDomain
{
    public IEnumerable<HouseDomain> DomainHouses {get;set;}
}
public class HouseDomain
{
    public IEnumerable<RoomDomain> DomainRooms {get;set;}
}    
public class RoomDomain
{
    //whatever
}

public class CityDto
{
    public IEnumerable<HouseDto> DtoHouses {get;set;}
}
public class HouseDto
{
    public IEnumerable<RoomDto> DtoRooms {get;set;}
}
public class RoomDto
{
    //whatever
}

所以我想将CityDomain映射到CityDto。我有......

Mapper.CreateMap<CityDomain , CityDto>();

是否存在像这样的2级深度问题?有帮助吗?谢谢!

2 个答案:

答案 0 :(得分:4)

这是您需要的所有映射(如果创建了适当对象类型的映射,Automapper足够智能地映射对象列表):

Mapper.CreateMap<RoomDomain, RoomDto>();
Mapper.CreateMap<HouseDomain, HouseDto>()
      .ForMember(d => d.DtoRooms, m => m.MapFrom(s => s.DomainRooms));

只需删除成员DtoRooms的第二个映射。例如。如果房子有id而房间有名字,那么对于样本域名房屋映射工作就好了:

HouseDomain domainHouse = new HouseDomain
{
    Id = 42,
    DomainRooms = new List<RoomDomain>
    {
        new RoomDomain { Name = "foo" },
        new RoomDomain { Name = "bar" }
    }
};

var dtoHouse = Mapper.Map<HouseDto>(domainHouse);

产地:

{
   Id: 42,
   DtoRooms: [ { Name: "foo" }, { Name: "bar" } ]
}

最后一点 - 确保在进行映射之前创建地图。通常所有地图都是在应用程序启动时创建的。

答案 1 :(得分:1)

如果您为RoomsHouseDomain类型设置相同的集合名称(例如HouseDto),则可以简化映射。

映射:

Mapper.CreateMap<RoomDomain, RoomDto>();
Mapper.CreateMap<HouseDomain, HouseDto>();

类型:

public class HouseDomain
{
    public IEnumerable<RoomDomain> Rooms {get;set;}
}

public class HouseDto
{
    public IEnumerable<RoomDto> Rooms {get;set;}
}

我刚才回答了类似问题AutoMapping nested models