2014-01-16 52 views
0

求解:我有一个属性定义错误!Automapper - 使用IEnumerable映射对象<anotherType>

我收到此错误... 缺少类型映射配置或不支持的映射。 映射类型: HouseDomain - > RoomDomain {命名空间} .HouseDomain - > {命名空间} .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映射到企业所得税。 yDto。我有...

Mapper.CreateMap<CityDomain , CityDto>(); 

是否有这样一个问题2层深?任何帮助?谢谢!

+0

如果你已经发布了'CreateMap'的底部,你不需要第二个'.ForMember'片段。如果元素类型被映射,AutoMapper会自动处理列表/枚举类型。 –

+1

这适用于我http://pastebin.com/6uZyDhbi –

+0

@AndrewWhitaker,Automapper自动处理列表/枚举,如果他们只有相同的名字。 –

回答

3

这是你需要的所有映射(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

你可以保持您的映射simplier如果你让两个HouseDomainHouseDto集合类型相同(例如Rooms)的名字。

映射:

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