2014-01-16 2 views
0

SOLVED: У меня было свойство, определенное неверно!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 в CityDto. У меня есть ...

Mapper.CreateMap<CityDomain , CityDto>(); 

Есть ли проблема, которая будет проходить на 2 уровнях так? Любая помощь? Благодаря!

+0

Вам не нужен второй фрагмент '.ForMember', если у вас есть« CreateMap », который вы разместили внизу. 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 членов. Например. если дом имеет идентификатор и номер имеет имя, то для образца отображения домена дома работает просто отлично:

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

Вы можете сохранить ваши сопоставления проще, если вы сделаете имена коллекций одинаковыми (например, Rooms) для обоих типов HouseDomain и 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 некоторое время назад.

Смежные вопросы